我使用的是Delphi 10.4.2,我試圖找到一種縮放影像的方法,既能保持影像質量,又能不要求外部庫.
。這就是我所嘗試的,你可以在{$REGION}中找到這兩個測驗:
procedure TFrmTestGenImg.Test; /span>
var.
LOldWidth, LOldHeight, LNewWidth, LNewHeight: integer;
LImageNameIn, LImageNameOut, LExt: string。
LClass: TGraphicClass;
LImageIn, LImageOut: TGraphic。
LBitmap, LResized: TBitmap。
begin[/span
//原始影像。1366 x 768
LOldWidth := 1366;
LOldHeight := 768;
LNewWidth := 800;
LNewHeight := 449;
LImageNameIn := 'C: empInput.png';
LImageNameOut := 'C: empOutput_' FormatDateTime('yyyy.mm.dd hh.nn.ss.zz', Now) ' .png';
LExt := TPath.GetExtension(LImageNameIn);
Delete(LExt, 1, 1)。
if (CompareText(LExt, 'bmp') = 0) 然后
LClass := TBitmap
else if (CompareText(LExt, 'gif'/span>) = 0) 然后
LClass := TGIFImage
else[/span
LClass := TWICImage;
LImageIn := LClass.Create;
try 試試
LImageOut := LClass.Create;
try
LImageIn.Transparent := True;
LImageIn.LoadFromFile(Trim(LImageNameIn))。
LBitmap := TBitmap.Create;
try
LBitmap.PixelFormat := pf24bit;
LBitmap.Assign(LImageIn);
{$REGION '1st test'}
LBitmap.Canvas.StretchDraw(
Rect(0, 0, LNewWidth, LNewHeight)。
LImageIn); // -> 質量差{$ENDREGION}。
{$REGION 'second test'}
LResized := TBitmap.Create;
try
LResized.Assign(LBitmap);
LResized.Width := LNewWidth;
LResized.Height := LNewHeight。
GraphUtil.ScaleImage(LBitmap, LResized, (LNewWidth/LOldWidth)); // -> 空影像。
LResized.SetSize(LNewWidth, LNewHeight)。
LImageOut.Assign(LResized)。
最終
LResized.Free。
end。
{$ENDREGION}
if LImageIn is TWICImagethen
begin
if (CompareText(LExt, 'jpg'/span>) = 0) or (CompareText(LExt, 'jpeg') = 0) 然后。
TWICImage(LImageOut).ImageFormat := wifJpeg
else[/span
TWICImage(LImageOut).ImageFormat := TWICImage(LImageIn).ImageFormat;
end。
LImageOut.SaveToFile(LImageNameOut)。
最后end。
最終
LImageOut.Free。
end;
finally
LImageIn.Free。
end;
end;
正如你所看到的,在第二個測驗中,我使用了GraphUtil.ScaleImage,但輸出是一個空的影像,所以我不確定我是否正確使用了它,不幸的是我沒有找到這個方法的任何例子。
uj5u.com熱心網友回復:
程式 ResizeBitmap(const Bitmap: TBitmap; const NewWidth, NewHeight: integer);
var
工廠。IWICImagingFactory;
縮放器。IWICBitmapScaler。
來源:TWICImage。
begin
Source := TWICImage.Create;
try
工廠 := TWICImage.ImagingFactory;
Source.Assign(Bitmap);
Factory.CreateBitmapScaler(Scaler);
Scaler.Initialize(Source.Handle, NewWidth, NewHeight, WICBitmapInterpolationModeHighQualityCubic)。
Source.Handle := IWICBitmap(Scaler);
Bitmap.Assign(Source);
Scaler := nil;
Factory := nil;
finally
Source.Free;
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316470.html
標籤:
