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]
    델 파이 이미지 처리-문장 인덱스 에 접근 할 수 있 습 니 다.
 

좋은 웹페이지 즐겨찾기