2016-12-18 14 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品質についてです。 –

+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;