PhotoShop 알고리즘 원리 분석 시리즈 - 픽셀화 - 조각화
이전 기사의 인기에 이어 조금 더 간단한 알고리즘에 대해 계속 이야기해 보겠습니다.
이 기사에서는 조각화 알고리즘에 대해 먼저 설명합니다.
이것이 파괴적인 필터인 이유는 이미지를 만드는 사람의 90%가 남자, 변태남자이기 때문입니다.
조각 필터의 원리와 관련하여 인터넷에서 사용할 수 있는 정보는 다음과 같습니다. 서로 오프셋된 이미지 사본 4개를 생성하여 고스팅과 유사한 효과를 생성합니다.
위의 문장만으로도 시작할 수 있습니다.
분석: 위의 이미지, 특히 눈을 비교하면 처리된 이미지가 단안이 4개의 눈이 된 것처럼 보여야 함을 알 수 있습니다. 따라서 위의 진술은 다음과 같습니다. 신뢰할 수 있습니다.
그렇다면 오프셋의 중심은 어디이며 오프셋 수는 얼마입니까? 이 질문도 매우 간단합니다. verify:
구체적인 단계는 다음과 같습니다. 이미지를 열고 이미지의 색상이 상대적으로 단조로운 곳(예: 위에서 언급한 아름다움의 팔) 그런 다음 레이어를 복사하고 복사된 레이어에 조각 필터를 적용한 다음 레이어 투명도를 50%로 조정하여 다음 이미지를 얻습니다. 🎜>
이 효과를 사용하면 쉽게 결론을 내릴 수 있습니다.오프셋의 중심은 각 픽셀의 중심에 있고 4개의 오프셋은 픽셀을 기준으로 대칭입니다. 경사가 45도인 중앙은 원 안에 균일하게 배열되며, 가로 및 세로 오프셋은 각각 45도, 오프셋은 4픽셀입니다.
그래서 어떻게 중첩하느냐는 질문을 짐작할 수 있는데, 4번의 오프셋 후에 누적된 값의 평균을 구하는 것입니다.
이 아이디어를 바탕으로 다음과 같은 알고리즘을 작성했습니다.
private void CmdFragment_Click(object sender, EventArgs e) { int X, Y, Z, XX, YY; int Width, Height, Stride; int Speed, Index; int SumR, SumG, SumB; Bitmap Bmp = (Bitmap)Pic.Image; if (Bmp.PixelFormat != PixelFormat.Format24bppRgb) throw new Exception("不支持的图像格式."); Width = Bmp.Width; Height = Bmp.Height; Stride = (int)((Bmp.Width * 3 + 3) & 0XFFFFFFFC); byte[] ImageData = new byte[Stride * Height]; // 用于保存图像数据,(处理前后的都为他) byte[] ImageDataC = new byte[Stride * Height]; // 用于保存克隆的图像数据 int[] OffsetX = new int[] { 4, -4, -4, 4 }; // 每个点的偏移量 int[] OffsetY = new int[] { -4, -4, 4, 4 }; fixed (byte* P = &ImageData[0], CP = &ImageDataC[0]) { byte* DataP = P, DataCP = CP; BitmapData BmpData = new BitmapData(); BmpData.Scan0 = (IntPtr)DataP; // 设置为字节数组的的第一个元素在内存中的地址 BmpData.Stride = Stride; Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite | ImageLockMode.UserInputBuffer, PixelFormat.Format24bppRgb, BmpData); Stopwatch Sw = new Stopwatch(); // 只获取计算用时 Sw.Start(); System.Buffer.BlockCopy(ImageData, 0, ImageDataC, 0, Stride * Height); // 填充克隆数据 for (Y = 0; Y < Height; Y++) { Speed = Y * Stride; for (X = 0; X < Width; X++) { SumB = 0; SumG = 0; SumR = 0; for (Z = 0; Z < 4; Z++) // 累积取样点的取样和 { XX = X + OffsetX[Z]; YY = Y + OffsetY[Z]; if (XX < 0) // 注意越界 XX = 0; else if (XX >= Width) XX = Width - 1; if (YY < 0) YY = 0; else if (YY >= Height) YY = Height - 1; Index = YY * Stride + XX * 3; SumB += DataCP[Index]; SumG += DataCP[Index + 1]; SumR += DataCP[Index + 2]; } DataP[Speed] = (byte)((SumB+2) >> 2); // 求平均值(Sum+2)/4,为什么要+2,就为了四舍五入。比如如果计算结果为108.6,则取像素109更为合理 DataP[Speed + 1] = (byte)((SumG + 2) >> 2); DataP[Speed + 2] = (byte)((SumR + 2) >> 2); Speed += 3; // 跳往下一个像素 } } Sw.Stop(); this.Text = "计算用时: " + Sw.ElapsedMilliseconds.ToString() + " ms"; Bmp.UnlockBits(BmpData); // 必须先解锁,否则Invalidate失败 } Pic.Invalidate();}
알고리즘에서 OffsetX 및 OffsetY는 각각 샘플링 포인트 픽셀의 오프셋입니다. 마찬가지로 이 필터에는 현장 작업이 포함되므로 처리하기 전에 픽셀 백업이 필요하지만 여기에서는 백업 데이터가 확장되지 않습니다. 따라서 샘플링 지점의 좌표가 범위를 초과하는지 확인하기 위해 내부 코드에서 확인해야 합니다. 범위를 초과하는 경우 일반적으로 이미지 필터 알고리즘의 범위 내에 있습니다.
(1) 초과하는 경우 가장 가까운 경계값, 즉 반복되는 가장자리 픽셀로 간주됩니다. 코드의 이 부분은 위에 게시된 if...else if 부분입니다. .
(2) 되감기는 다음 코드로 설명할 수 있습니다.
while (XX >= Width) XX = XX - Width;while (XX < 0) XX = XX + Width;while (YY >= Height) YY = YY - Height;while (YY < 0) YY = YY + Height;
( 3 ) 이미지 범위 내의 픽셀만 계산합니다:
if (XX >= 0 && XX < Width && YY >= 0 && YY < Height) { // 累加计算 }
물론 이렇게 하려면 변수를 사용하여 어떻게 되는지 기록해야 합니다. 적격 계산이 많이 수행되었습니다.
관심있는 친구들은 코드를 바꿔서 한번 해보세요.
위 코드에서 DataP[Speed] = (byte)((SumB+2) >> 2); SumB에 2를 더한 이유는 결과를 반올림하기 위한 것입니다. 더 정확하고 합리적입니다. 테스트 결과 위 코드는 PS 처리 효과와 100% 일치합니다. 이는 우리의 추측이 완전히 정확하다는 것을 보여줍니다. 알고리즘을 더 확장할 수도 있습니다. 좀 더 생각해 보세요. 왜 4개의 유령 이미지여야 할까요? 4여야 합니다. 픽셀의 가로 및 세로 오프셋입니다. 관심 있는 독자들이 스스로 발전할 수 있도록 아래 그림을 제공합니다. 사진에서 각도는 32도, 반경은 10, 조각수는 7개, 다음과 유사한 효과를 낼 수 있습니다(내 Imageshop을 사용하여 확인할 수 있습니다): PHP 중국어 웹사이트에 주목하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PS "로드"문제는 자원 액세스 또는 처리 문제로 인한 것입니다. 하드 디스크 판독 속도는 느리거나 나쁘다 : CrystalDiskinfo를 사용하여 하드 디스크 건강을 확인하고 문제가있는 하드 디스크를 교체하십시오. 불충분 한 메모리 : 고해상도 이미지 및 복잡한 레이어 처리에 대한 PS의 요구를 충족시키기 위해 메모리 업그레이드 메모리. 그래픽 카드 드라이버는 구식 또는 손상됩니다. 운전자를 업데이트하여 PS와 그래픽 카드 간의 통신을 최적화하십시오. 파일 경로는 너무 길거나 파일 이름에는 특수 문자가 있습니다. 짧은 경로를 사용하고 특수 문자를 피하십시오. PS 자체 문제 : PS 설치 프로그램을 다시 설치하거나 수리하십시오.

PDF로 PS를 내보낼 때 자주 묻는 질문 및 솔루션 : 글꼴 임베딩 문제 : "글꼴"옵션을 확인하고 "포함"을 선택하거나 글꼴을 곡선 (경로)으로 변환하십시오. 색상 편차 문제 : 파일을 CMYK 모드로 변환하고 색상을 조정하십시오. RGB로 직접 내보내려면 미리보기 및 색상 편차를위한 심리적 준비가 필요합니다. 해상도 및 파일 크기 문제 : 실제 조건에 따라 해상도를 선택하거나 압축 옵션을 사용하여 파일 크기를 최적화하십시오. 특수 효과 문제 : 내보내기 전에 층을 병합 (평평한).

PS 카드가 "로드"되어 있습니까? 솔루션에는 컴퓨터 구성 (메모리, 하드 디스크, 프로세서) 확인, 하드 디스크 조각 청소, 그래픽 카드 드라이버 업데이트, PS 설정 조정, PS 재설치 및 우수한 프로그래밍 습관 개발이 포함됩니다.

Photoshop에서 암호로 보호 된 PDF를 내보내십시오 : 이미지 파일을 엽니 다. "파일"을 클릭하십시오. & gt; "수출"& gt; "PDF로 수출". "보안"옵션을 설정하고 동일한 비밀번호를 두 번 입력하십시오. "내보내기"를 클릭하여 PDF 파일을 생성하십시오.

느린 Photoshop 스타트 업 문제를 해결하려면 다음을 포함한 다중 프론트 접근 방식이 필요합니다. 하드웨어 업그레이드 (메모리, 솔리드 스테이트 드라이브, CPU); 구식 또는 양립 할 수없는 플러그인 제거; 정기적으로 시스템 쓰레기 및 과도한 배경 프로그램 청소; 주의를 기울여 관련없는 프로그램 폐쇄; 시작하는 동안 많은 파일을 열지 않도록합니다.

"로드"는 PS에서 파일을 열 때 말더듬이 발생합니다. 그 이유에는 너무 크거나 손상된 파일, 메모리 불충분, 하드 디스크 속도가 느리게, 그래픽 카드 드라이버 문제, PS 버전 또는 플러그인 충돌이 포함될 수 있습니다. 솔루션은 다음과 같습니다. 파일 크기 및 무결성 확인, 메모리 증가, 하드 디스크 업그레이드, 그래픽 카드 드라이버 업데이트, 의심스러운 플러그인 제거 또는 비활성화 및 PS를 다시 설치하십시오. 이 문제는 PS 성능 설정을 점차적으로 확인하고 잘 활용하고 우수한 파일 관리 습관을 개발함으로써 효과적으로 해결할 수 있습니다.

깃털 통제의 열쇠는 점진적인 성격을 이해하는 것입니다. PS 자체는 그라디언트 곡선을 직접 제어하는 옵션을 제공하지 않지만 여러 깃털, 일치하는 마스크 및 미세 선택으로 반경 및 구배 소프트를 유연하게 조정하여 자연스럽게 전이 효과를 달성 할 수 있습니다.

Photoshop에서 수직 가이드를 당기기 : 통치자보기 (보기 & gt; inuler)를 활성화하십시오. 통치자의 수직 가장자리 위로 마우스를 마우스로 덮은 다음 커서는 이중 화살표가있는 수직선이되고 마우스를 잡고 드래그하여 참조 라인을 꺼냅니다. 가이드를 드래그하거나 십자가로 가져 가서 삭제를 클릭하십시오.
