2011-12-03 2 views
4

this question에서 나는 CopyRect 메서드의 올바른 사용에 대해 물었습니다. 내 문제가 해결 된 대답을 가지고 있지만 지금은 복사 된 사각형의 색이 잘못되었습니다 (256 값으로 제한?). 거짓 색상델파이에서 올바른 색상으로 CopyRect (스케일링)

var 
    Bmp: TBitmap; 
begin 
    Image1.Picture.LoadFromFile(SomeJPGimage); 

    Bmp := TBitmap.Create; 
    try 
    Bmp.Assign(Image1.Picture.Graphic); 
    with Bmp do 
     Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect); 
    finally 
    Bmp.Free; 
    end; 
end; 

enter image description here

삽입 된이 이미지 2입니다 : 이 코드입니다. 크기를 조정하지 않으면 색상이 맞습니다.
크기를 조정할 때 원본 이미지 (JPG)의 24 비트 색상을 얻으려면 어떻게해야합니까?

편집
그리기가 아닙니다. 원본 이미지의 일부분의 크기가 조정 된 버전을 복사하고 싶습니다.

+0

문제점을 중복 적용 할 수 없습니다. 당신이보고있는 것은 크기 조정의 결과라고 생각합니다. 아마도 이미지가 축소되었을 것입니다. 이 테스트를 수행하십시오 : http://www.spronkey.com/sdc-gradients.png을 잡고 jpg로 변환하십시오. 이 이미지를로드하지만 ** 이미지의 크기를 조정하지 않고 ** 코드를 실행하십시오. Image2.Canvas.CopyRect (Rect (0,0,300,74), Canvas, Rect (46010767601150));'이 부분은 jpg로 변환하기 전에 고유 색상이 599 개 있습니다. 변환 후 약 8000 개의 고유 한 색상이 있습니다. 원하는 경우 이미지의 다른 부분으로 테스트를 복제하십시오. 색상 감소가 발생하지 않을 것입니다. –

+0

RGB 큐브 부분은 Image2.Canvas를 변환하기 전에 테스트 용으로 16384 색이 더 좋습니다.CopyRect (Rect (0,0,128,128), Canvas, Rect (1118,683,1246,811)); –

+0

@Sertac - 잘못된 색상은 크기 변경의 결과 인 것처럼 보이며 CopyRect 자체의 결과는 아닙니다. 내 질문을 조정합니다 : 크기 조정 및 진정한 색상을 유지하는 방법이 있습니까? – stevenvh

답변

3

이것은 색상 감소 또는 잘못된 픽셀 형식 때문에 발생하지 않습니다. 복사하는 동안 이미지가 축소되고 'StretchBlt'가 이미지를 압축하고 모드에 따라 일부 아티팩트가 생성됩니다. 예를 들어 크기가 128x128 미만인 경우

enter image description here

은 크기 조정을 적용하지 않으면 똑같이 표시됩니다. 그러나 예를 들어 90x100 이미지에 적용하면 출력은

enter image description here입니다.

당신은 약간 더 나은 결과를 위해 stretching mode을 변경할 수 있습니다

var 
    Bmp: TBitmap; 
begin 
    Image1.Picture.LoadFromFile(SomeJPGimage); 

    Bmp := TBitmap.Create; 
    try 
    Bmp.Assign(Image1.Picture.Graphic); 

    SetStretchBltMode(Image2.Canvas.Handle, HALFTONE); // <- here 

    with Bmp do 
     Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect); 
    finally 
    Bmp.Free; 
    end; 
end; 


를 출력 지금이된다 위의 원본 사진의 경우 :

enter image description here

(탐색 데 조금 'graphics.pas' , VCL 8 비트 이미지에 대해서만 하프 톤을 사용하는 것으로 보인다.이 평가에서 잘못되었거나 올바른 수 있지만 어떤 경우에도 하프 톤 스트레칭 모드가 그러한 제약이 없습니다.)


더 좋은 점은 적절한 그래픽 라이브러리를 사용해야한다는 것입니다.

+0

우수! 'SetStretchBltMode'는 트릭을하는 것처럼 보입니다. 대단히 감사합니다. – stevenvh

+0

여러분을 환영합니다! –

+2

귀하의 예는 그레이 스케일 그라디언트와 마찬가지로 앨리어싱 밴딩을 보여 주지만 본보기는 잘못된 색상, 즉 원본에없는 색상을가집니다. 아마도 그라데이션의 효과와 '실제'의 효과를 비교할 수 있습니다. – stevenvh

4

다시 편집 :

이 문제가 잘못된 캔버스 (당신이 그것을 사용하지 않는 경우 TImage의 너무 쉬운)에 대한 것입니다 밝혀졌습니다. 마지막 샘플에 파일을 저장하려고했는데 내가 지정한 파일에 거대한 파일이 있습니다. 그래서 나는 다른 값들을 조사하기 시작했는데 Bitmap Canvas와 비교할 필요가 있다는 것을 발견했다. ...

var 
    BMP: TBitmap; 
    MyClipRect: TRect; 
begin 
    if OpenDialog1.Execute then 
    begin 
     Image1.Picture.LoadFromFile(OpenDialog1.FileName); 
     Bmp := TBitmap.Create; 
     try 
     Bmp.Assign(Image1.Picture.Graphic); 
     myClipRect.Left := (Bmp.Width div 2); 
     myClipRect.Top := (Bmp.Height div 2); 
     myClipRect.Right := (Bmp.Width); 
     myClipRect.Bottom := (Bmp.Height); 

     with Image2.Picture.Bitmap do 
      begin 
      Width := Bmp.Width div 2; 
      Height := Bmp.Height div 2; 
      Canvas.CopyRect(Canvas.ClipRect, Bmp.Canvas, MyClipRect); 
      end; 
     Image2.Picture.SaveToFile('image2.bmp'); 
     finally 
     Bmp.Free; 
     end; 
    end; 
end; 

마침내 그것을 얻었 으면 좋겠다. 예지.

+0

답해 주셔서 감사합니다. 불행하게도 Draw는 할 수 없으므로 원본 이미지의 일부분의 크기가 조정 된 버전을 복사하기 때문에 CopyRect를 사용해야합니다. – stevenvh

+0

물론 가능합니다. 나는 이미지를 지정하거나 그리기를 원한다. 그러면 당신의 CopyRect를한다. 그것은 나를 위해 여기에서 일하고있다. – Glenn1234

+0

나는 내가 이해하고 있는지 잘 모르겠다. Image2를 중간 이미지로 사용하고 CopyRect를 사용하여 세 번째 이미지로 사용합니까? 나는 이것을 시도했지만, Draw가 잘 작동하는 동안, CopyRect는 그것을 망쳐 놓는다. 전체 코드를 게시 할 수 있습니까? – stevenvh