一句话解决Thumbnails缩略图工具PNG透明背景缩放后变黑问题

注意加红色的部分:

            Builder<BufferedImage> builder = Thumbnails.of(sourceImage).imageType(BufferedImage.TYPE_INT_ARGB).forceSize(width, height);
            builder.outputFormat("png").toFile(destFile);
 

有人可能问thumbnailator是什么?一个缩放开源项目而已。

给个gradle地址:

api 'net.coobird:thumbnailator:0.4.8'

以下是Delphi实现批量缩略图生成工具开发代码的示例: ```delphi unit MainForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Imaging.jpeg, Vcl.Imaging.pngimage, Vcl.Imaging.GIFImg; type TfrmMain = class(TForm) btnOpenFolder: TButton; lvImages: TListView; btnGenerateThumbnails: TButton; imgThumbnail: TImage; chkMaintainAspectRatio: TCheckBox; edtWidth: TEdit; edtHeight: TEdit; lblWidth: TLabel; lblHeight: TLabel; lblPixels: TLabel; lblStatus: TLabel; pbProgress: TProgressBar; procedure btnOpenFolderClick(Sender: TObject); procedure lvImagesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); procedure btnGenerateThumbnailsClick(Sender: TObject); procedure chkMaintainAspectRatioClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FImageList: TImageList; FImageFiles: TStringList; FCurrentImage: TGraphic; procedure LoadImageFiles(const AFolder: string); procedure GenerateThumbnail(const AFileName: string); procedure UpdateThumbnailPreview; public { Public declarations } end; var frmMain: TfrmMain; implementation {$R *.dfm} procedure TfrmMain.btnOpenFolderClick(Sender: TObject); var FolderDlg: TFileOpenDialog; begin FolderDlg := TFileOpenDialog.Create(nil); try FolderDlg.Options := FolderDlg.Options + [fdoPickFolders]; if FolderDlg.Execute then begin LoadImageFiles(FolderDlg.FileName); end; finally FolderDlg.Free; end; end; procedure TfrmMain.btnGenerateThumbnailsClick(Sender: TObject); var I: Integer; begin pbProgress.Max := lvImages.Items.Count; pbProgress.Position := 0; for I := 0 to FImageFiles.Count - 1 do begin GenerateThumbnail(FImageFiles[I]); pbProgress.Position := I + 1; end; pbProgress.Position := 0; lblStatus.Caption := 'Thumbnails generated successfully.'; end; procedure TfrmMain.chkMaintainAspectRatioClick(Sender: TObject); begin if chkMaintainAspectRatio.Checked then begin edtHeight.Enabled := False; edtHeight.Text := '0'; end else begin edtHeight.Enabled := True; end; end; procedure TfrmMain.FormCreate(Sender: TObject); begin FImageList := TImageList.Create(nil); FImageFiles := TStringList.Create; end; procedure TfrmMain.FormDestroy(Sender: TObject); begin FImageList.Free; FImageFiles.Free; end; procedure TfrmMain.GenerateThumbnail(const AFileName: string); var Image: TGraphic; Thumbnail: TBitmap; Width, Height: Integer; begin // Load the image Image := nil; try Image := TGraphic.Create; Image.LoadFromFile(AFileName); // Calculate the dimensions of the thumbnail if chkMaintainAspectRatio.Checked then begin if Image.Width > Image.Height then begin Width := StrToInt(edtWidth.Text); Height := MulDiv(Image.Height, Width, Image.Width); end else begin Height := StrToInt(edtHeight.Text); Width := MulDiv(Image.Width, Height, Image.Height); end; end else begin Width := StrToInt(edtWidth.Text); Height := StrToInt(edtHeight.Text); end; // Generate the thumbnail Thumbnail := TBitmap.Create; try Thumbnail.Width := Width; Thumbnail.Height := Height; Thumbnail.Canvas.StretchDraw(Rect(0, 0, Width, Height), Image); FImageList.Add(Thumbnail, nil); finally Thumbnail.Free; end; finally Image.Free; end; end; procedure TfrmMain.LoadImageFiles(const AFolder: string); var SearchRec: TSearchRec; Image: TGraphic; ListItem: TListItem; begin FImageList.Clear; FImageFiles.Clear; lvImages.Items.Clear; if FindFirst(AFolder + '\*.*', faAnyFile, SearchRec) = 0 then begin repeat if (SearchRec.Attr and faDirectory) <> 0 then Continue; Image := nil; try Image := TGraphic.Create; Image.LoadFromFile(AFolder + '\' + SearchRec.Name); FImageFiles.Add(AFolder + '\' + SearchRec.Name); ListItem := lvImages.Items.Add; ListItem.Caption := SearchRec.Name; ListItem.SubItems.Add(IntToStr(Image.Width)); ListItem.SubItems.Add(IntToStr(Image.Height)); ListItem.ImageIndex := FImageList.Count; finally Image.Free; end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end; FImageList.SetSize(FImageFiles.Count, FImageFiles.Count); lvImages.LargeImages := FImageList; lvImages.SmallImages := FImageList; lblStatus.Caption := IntToStr(FImageFiles.Count) + ' images loaded successfully.'; end; procedure TfrmMain.lvImagesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); begin if Selected then begin FCurrentImage := TGraphic.Create; FCurrentImage.LoadFromFile(FImageFiles[Item.Index]); UpdateThumbnailPreview; end else begin FCurrentImage.Free; FCurrentImage := nil; imgThumbnail.Picture.Assign(nil); end; end; procedure TfrmMain.UpdateThumbnailPreview; var Thumbnail: TBitmap; Width, Height: Integer; begin if FCurrentImage = nil then begin imgThumbnail.Picture.Assign(nil); Exit; end; if chkMaintainAspectRatio.Checked then begin if FCurrentImage.Width > FCurrentImage.Height then begin Width := StrToInt(edtWidth.Text); Height := MulDiv(FCurrentImage.Height, Width, FCurrentImage.Width); end else begin Height := StrToInt(edtHeight.Text); Width := MulDiv(FCurrentImage.Width, Height, FCurrentImage.Height); end; end else begin Width := StrToInt(edtWidth.Text); Height := StrToInt(edtHeight.Text); end; Thumbnail := TBitmap.Create; try Thumbnail.Width := Width; Thumbnail.Height := Height; Thumbnail.Canvas.StretchDraw(Rect(0, 0, Width, Height), FCurrentImage); imgThumbnail.Picture.Assign(Thumbnail); finally Thumbnail.Free; end; end; end. ``` 这个示例代码使用了Delphi的TListView、TImageList和TGraphic控件来加载图片文件,生成缩略图,并在屏幕上显示。可以通过选择文件夹、选择图片、调整缩略图大小等功能来实现批量生成缩略图的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值