Delphi 이미지 처리--감마 설정
《Delphi 이미지 처리 시 리 즈 는 효율 에 중점 을 두 고 일반 코드 는 PASCAL 이 며 핵심 코드 는 BASM 을 사용한다.
《C++이미지 처리 시 리 즈 는 코드 가 뚜렷 하고 가 독성 을 위주 로 하 며 모두 C+코드 를 사용한다.
가능 한 한 양자 의 내용 이 일치 하도록 유지 하면 서로 대조 할 수 있다.
본 고 는'Delphi 이미지 처리-데이터 형식 및 공용 과정'의 ImageData.pas 단원 을 포함해 야 합 니 다.
그저께 어떤 친구 가 메 일 을 보 내 서 GDI+의 ImageAttributes.SetGamma 방법 을 어떻게 사용 하 는 지 물 었 습 니 다.그 는 GDI+SetGamma 방법 을 사용 할 때 주어진 매개 변수 값 이 클 수록 그림 이 어 두 워 지고 반대로 밝 아 지 는 것 이 자신 이 이해 하 는 것 과 다른 것 같다 고 말 했다.내 가 테스트 해 봤 는데,확실히 그렇다.NET 2.0 라 이브 러 리 문 서 를 찾 아 봤 는데 이 방법 에 대한 설명 은:
gamma 매개 변수의 전형 적 인 값 은 1.0 에서 2.2 사이 이다.그러나 어떤 경우 에는 0.1 에서 5.0 범위 내의 값 도 유용 하 다.
ImageAttributes 대상 은 다섯 가지 종류의 색상 과 그 레이스 케 일 설정 을 유지 합 니 다.기본,비트 맵,붓,만년필 과 텍스트 입 니 다.예 를 들 어 기본 클래스 에 감마 값 을 지정 하고 비트 맵 클래스 에 다른 감마 값 을 지정 한 다음 만년필 클래스 에 다른 감마 값 을 지정 할 수 있 습 니 다.
기본 색상 조정 설정 과 그 레이스 케 일 조정 설정 은 설정 이 조정 되 지 않 은 모든 클래스 에 적 용 됩 니 다.예 를 들 어 만년필 카 테 고리 에 조정 설정 을 지정 한 적 이 없다 면 기본 설정 은 만년필 카 테 고리 에 적용 된다.
특정한 분류 에 색상 조정 이나 그 레이스 케 일 조정 설정 을 지정 하면 기본 조정 설정 은 이 분류 에 사용 되 지 않 습 니 다.예 를 들 어 기본 클래스 에 조정 설정 집합 을 지정 했다 고 가정 합 니 다.펜 을 SetGamma 에 전달 하 는 방법 으로 만년필 종류 에 감마 값 을 설정 하면 기본 설정 은 만년필 에 적용 되 지 않 습 니 다.
정상 범위 이외 의 감마 값 은 구식 CRT 모니터 나 일반 조명 조건(예 를 들 어 산업 환경 이나 쇼윈도 배치)이 아 닌 모니터 에 사용 할 수 있다.
그리고 또 하나의 예 는 아래 에 발췌 되 어 있다.
void SetGammaExample( PaintEventArgs^ e )
{
// Create an Image object from the file Camera.jpg, and draw it to
// the screen.
Image^ myImage = Image::FromFile( "Camera.jpg" );
e->Graphics->DrawImage( myImage, 20, 20 );
// Create an ImageAttributes object and set the gamma to 2.2.
ImageAttributes^ imageAttr = gcnew ImageAttributes;
imageAttr->SetGamma( 2.2f );
// Draw the image with gamma set to 2.2.
Rectangle rect = Rectangle(250,20,200,200);
e->Graphics->DrawImage( myImage, rect, 0, 0, 200, 200, GraphicsUnit::Pixel, imageAttr );
}
예 를 들 어 감마 교정 값 2.2 를 설정 한 후 그림 에 나타 난 결 과 는 감마 교정 을 사용 하지 않 은 것 보다 밝 아야 하 는데 지금 결 과 는 반대 입 니 다!우리 가 잘못 이해 한 거 야,아니면 GDI+의 버그 야??
의혹 을 가지 고 인터넷 에서 검색 해 보 니 과연 MSDN 게시판 에서 똑 같은 의문 이 있 었 다.http://social.msdn.microsoft.com/Forums/zh-HK/csharpgeneral/thread/efc76edd-adf1-4acb-aa34-fe5fdd01b183그러나 판 주의 해답 은 이런 효과 가 옳다 고 말 했다.
스스로 감마 보 정 을 설정 하 는 함 수 를 썼 는데 GDI+의 ImageAttributes.SetGamma 방법 과 비교 해도 정반 대 입 니 다.그러나 GDI+의 SetGamma 방법 매개 변 수 를 역수 형식 으로 제시 하면 제 가 쓴 함수 효과 와 같 습 니 다(제 가 쓴 함수 중의 exponent:=1/Gamma 문 구 를 exponent:=Gamma 로 바 꾸 면 GDI+의 SetGamma 방법 과 효과 가 같 습 니 다).
procedure ImageSetGamma(var Data: TImageData; Gamma: Single);
var
I: Integer;
exponent: Double;
gammaTab: array[0..255] of byte;
begin
exponent := 1 / Gamma; // exponent := Gamma;, GDI+ SetGamma
for I := 0 to 255 do
begin
gammaTab[I] := Round(Power((I + 0.5) / 256, exponent) * 256 - 0.5);
end;
asm
push ebp
push esi
push edi
push ebx
mov eax, data
call _SetDataRegs
lea esi, gammaTab
mov ebp, edx
@@yLoop:
push ecx
@@xLoop:
movzx eax, [edi].TARGBQuad.Blue
movzx edx, [edi].TARGBQuad.Green
mov al, [esi+eax]
mov dl, [esi+edx]
mov [edi].TARGBQuad.Blue, al
mov [edi].TARGBQuad.Green, dl
movzx eax, [edi].TARGBQuad.Red
mov al, [esi+eax]
mov [edi].TARGBQuad.Red, al
add edi, 4
loop @@xLoop
pop ecx
add edi, ebx
dec ebp
jnz @@yLoop
pop ebx
pop edi
pop esi
pop ebp
end;
end;
//---------------------------------------------------------------------------
procedure TForm1.Button3Click(Sender: TObject);
var
bmp: TGpBitmap;
g: TGpGraphics;
data: TImageData;
begin
bmp := TGpBitmap.Create('..\media\source.bmp');
g := TGpGraphics.Create(Canvas.Handle);
g.DrawImage(bmp, 0, 0);
data := LockGpBitmap(bmp);
ImageSetGamma(data, 2.2);
UnlockGpBitmap(bmp, data);
g.DrawImage(bmp, 0, data.Height);
g.Free;
bmp.Free;
end;
《Delphi 이미지 처리 시 리 즈 는 GDI+유닛 다운로드 주소 와 설명 을 사용 하여'GDI+for VCL 기반-GDI+와 VCL'을 참조 합 니 다.
수준 이 제한 되 어 있 기 때문에,실 수 는 불가피 하 니,지적 과 지 도 를 환영 합 니 다.이메일 주소:[email protected]
델 파이 이미지 처리-문장 인덱스 에 접근 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java/PDF에서 이미지 바꾸기우리 모두 알다시피 PDF는 편집하기 어려운 일종의 문서 형식입니다. 그러나 다른 사람으로부터 PDF 문서를 받을 때 문서의 이미지를 새 이미지로 바꾸는 등 약간의 수정이 필요할 수 있습니다. 이 문서에서는 Java...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.