2016-12-18 4 views
1

TGifimage 애니메이션을 다음 절차를 사용하여 크기를 조정하려고합니다. 문제없이 크기를 조정할 수 있지만 애니메이션 GIF의 품질이 매우 좋지 않습니다.TGifimage 크기 조정

품질 향상 방법에 대한 아이디어가 있으십니까?

현재 애니메이션 GIF가 검은 색으로 나타나 손상되었습니다.

procedure ResizeGif(Src, Dst: TGifImage; const newHeight, newWidth: integer); 
var 
    bmp, bmp2: TBitmap; 
    gifren: TGIFRenderer; 
    I: integer; 

begin 
    if (Src.Empty) or not assigned(Src.Images[0]) then 
    begin 
    exit; 
    end; 

    bmp := TBitmap.Create; 
    bmp2 := TBitmap.Create; 
    gifren := TGIFRenderer.Create(Src); 

    try 
    bmp.PixelFormat := pf24bit; 
    bmp2.PixelFormat := pf24bit; 
    bmp.Width := newWidth; 
    bmp.Height := newHeight; 

    for I := 0 to Src.Images.Count - 1 do 
    begin 

     bmp.SetSize(newWidth, newHeight); 

     gifren.Draw(bmp.Canvas, bmp.Canvas.ClipRect); 

     bmp2.SetSize(newWidth, newHeight); 

     bmp2.Canvas.StretchDraw(Rect(0, 0, newWidth, newHeight), bmp); 

     TGIFGraphicControlExtension.Create(Dst.add(bmp2)).Delay := 
     gifren.FrameDelay div 10;; 

     gifren.NextFrame; 

    end; 

    TGIFAppExtNSLoop.Create(Dst.Images.Frames[0]).Loops := 0; 

    finally 
    bmp.free; 
    bmp2.free; 
    gifren.free; 
    end; 

end; 
+0

당신이 어떤 다른 문제는 애니메이션 문제에 대해 없었다이 이미 –

+0

@DavidHeffernan을 물어 내가 해결하지 않았다 True로 크기가 조정 된 이미지 애니메이션을 설정하여,이 품질에 관한 것입니다 –

+1

우리는 어떤 크기가 관련되어 있는지 짐작할 수 있습니다. 래스터 이미지의 크기를 조정하는 것은 어렵습니다. 가끔은 잘하는 것이 불가능합니다. 종종 이미지 데이터에 맞도록 올바른 알고리즘을 선택해야합니다. –

답변

0

내가 아는 한 표준 라이브러리로는 그렇게 할 수 없습니다. Graphics32. 그러면 정확히 무엇이 필요한지에 따라 아래의 간단한 함수를 작성하고 샘플러를 선택할 수 있습니다 (Resampling 참조).

Class name  | Quality | Performance 
------------------------------------------ 
TNearestResampler | low  | high 
TDraftResampler | medium | high (downsampling only) 
TLinearResampler | medium | medium 
TKernelResampler | high | low (depends on kernel width) 

예의 TGraphicHelper.Resize

procedure TGraphicHelper.Resize(const AWidth, AHeight: Integer); 
var 
    lBmpTemp : TBitmap; 
    lBmpSource : TBitmap32; 
    lBmpResize : TBitmap32; 
begin 
    lBmpTemp := TBitmap.Create; 
    lBmpSource := TBitmap32.Create; 
    lBmpResize := TBitmap32.Create; 
    try 
    TDraftResampler.Create(lBmpSource); 
    lBmpSource.DrawMode := dmOpaque; 
    lBmpSource.Assign(Self); 

    lBmpResize.Width := AWidth; 
    lBmpResize.Height := AHeight; 
    lBmpResize.Clear(clWhite32); 
    lBmpResize.Draw(lBmpResize.BoundsRect, lBmpSource.BoundsRect, lBmpSource); 

    lBmpTemp.Assign(lBmpResize); 
    Self.Assign(lBmpTemp); 
    finally 
    lBmpTemp.Free; 
    lBmpSource.Free; 
    lBmpResize.Free; 
    end; 
end;