2016-12-18 3 views
1

Я пытаюсь изменить размер анимации TGifimage, используя следующую процедуру. Я могу изменить размер без проблем, но качество анимированного gif очень плохо.Изменение размера TGifimage

Любая идея, как повысить качество?

В настоящее время анимированные gifs выходят черным и выглядят развращенными.

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 нет другого вопроса был о выпуске анимации и я решить, что, установив уменьшенную анимацию изображений в Правда, один о качестве –

+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; 
Смежные вопросы