调整PNG图像的大小

时间:2010-03-13 08:08:41

标签: delphi image graphics resize png

HI!你能告诉我如何调整.png图像的大小。或者更好地举个例子。我一直在寻找答案,似乎没有人知道如何调整.png图像的大小并保持其透明度。 :(

5 个答案:

答案 0 :(得分:22)

PNGImage组件的原始作者(Delphi本机组件的基础)有一个论坛,他和其他人发布了关于如何使用PNGImage组件执行操作的代码片段。

在论坛被删除之前,我抓住了所有代码片段的副本,并将它们放在CodeGear Code Central网站上。

大多数(如果不是全部)都可以使用本机PNG图像并保持Alpha通道。

以下是包中包含的完整示例列表:

  • 平滑旋转PNG对象
  • 使用平滑算法调整TPNGObject的大小
  • 将一个PNG切成几个较小的PNG
  • 将图像另存为位图或png。
  • 样本块后代
  • 读取所有tEXt-Chunks并将值写入TStrings对象
  • 显示包含从PNG文件中提取的信息的消息框
  • 从PNG图像中查找并剪切块
  • 此方法将png转换为jpeg对象
  • 此方法将png转换为bmp对象
  • 将一个PNG叠加在另一个
  • 这使图像半透明
  • 垂直翻转png图像并保存回来
  • 在桌面上绘制png图像

以下是链接:CodeCentral PNG Methods

答案 1 :(得分:2)

您可以在Delphi 2010中使用Windows Imaging Component(WIC)。您可以在TWICImage类中加载PNG图像,然后从其句柄中提取IWICBitmapScaler接口。

使用IWICBitmapScaler,您可以缩小或缩小图像。

WIC适用于Windows Vista和Windows 7.对于Windows XP,您必须在使用之前安装更新。

答案 2 :(得分:1)

有PngImage版本(便携式网络图形Delphi) 这允许通过简单的StretchDraw来实现。

我有允许这样做的版本 - 1。1564(2006年7月31日)

不允许的版本 - 1。4361(2003年3月8日)

为了执行它,我使用了:

heart.png - 具有透明度,我设法调整大小并保存透明度。

empty.png - 纯透明的png。它被用作空白表来将我的图像放在上面。

我已经通过这样的代码检查了它:

procedure TForm1.Button1Click(Sender: TObject);
var pic_empty, pic_stamp, pic_result :TPicture;
   r:TRect;
   png : TPNGObject;
begin

  pic_stamp := TPicture.Create;
  pic_stamp.LoadFromFile('c:\heart.png');
  pic_stamp.Graphic.Transparent := True;

  pic_empty := TPicture.Create;
  pic_empty.LoadFromFile('c:\empty.png');
  pic_empty.Graphic.Transparent := True;

  r.Left := 0;
  r.Top := 0;
  r.Right := r.Left + 100;
  r.Bottom := r.Top + 100;

  pic_result := tpicture.Create;
  pic_result.Bitmap.Assign(pic_empty.Graphic);
  pic_result.Graphic.Transparent := True;
  pic_result.Bitmap.Canvas.StretchDraw(r,pic_stamp.Graphic);
  pic_result.Bitmap.Width :=100;
  pic_result.Bitmap.Height:=100;

  png := TPNGObject.Create;
  png.Assign(pic_result.Bitmap);
  png.SaveToFile('c:\result.png');

  png.Free;
  pic_result.Free;
  pic_empty.Free;
  pic_stamp.free;

end;

Delphi-7,win7 x64

答案 3 :(得分:1)

不幸的是, vcldeveloper 在他的answer中没有给出示例。

这是一个小例子。

var
  vImage: TWICImage;
  vScaler: IWICBitmapScaler;
begin
   ...

    vImage := TWICImage.Create;
    try
      ...

      vImage.ImagingFactory.CreateBitmapScaler(vScaler);
      vScaler.Initialize(vImage.Handle, NewWidth, NewHeight, WICBitmapInterpolationModeFant);

      vImage.Handle := IWICBitmap(vScaler);

      ...
    finally
      vImage.Free;
    end 

在Delphi源代码中可以找到更多示例。

答案 4 :(得分:-1)

我必须承认我没有任何以编程方式玩png的经验 无论如何,你会发现一些lib here。除了原生的Delphi PNG支持外,我想你会发现所有现有的库(当然是delphi本身)。

如果没有什么可以帮助你,请考虑尽可能使用ImageMagick ...这是图像处理的瑞士军刀,它所能做的一切在命令行中是可行的