调整PNG图像大小

6

你好!您能告诉我如何调整 .png 图像的大小吗?或者最好给一个示例。我已经寻找答案很长时间了,似乎没有人知道如何调整 .png 图像的大小并保持其透明性。:(

5个回答

22

PNGImage 组件的原始作者(Delphi 原生组件的基础)曾经有一个论坛,他和其他人在上面发布了使用 PNGImage 组件完成各种操作的代码片段。

在这个论坛被关闭之前,我将所有的代码片段复制并放置在 CodeGear Code Central 网站上。

其中大部分(如果不是全部)适用于本地 PNG 图像,并保持 Alpha 通道。

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

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

以下是链接:CodeCentral PNG 方法


如果你正在使用TPNGImage,请在代码示例中将TPNGObject替换为TPNGImage。 - Jan Doggen

3
你可以在Delphi 2010中使用Windows Imaging Component (WIC)。你可以将PNG图像加载到TWICImage类中,然后从其句柄中提取IWICBitmapScaler接口。
使用IWICBitmapScaler,你可以缩小或放大图像。
WIC可用于Windows Vista和Windows 7。对于Windows XP,你需要安装更新才能使用它。

1
有PngImage(Portable Network Graphics Delphi)的版本可以通过简单的StretchDraw来完成。
我有一个允许这样做的版本-1.564(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


1

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

这里有一个小例子。

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源代码中找到。

-1

我必须承认,我没有任何编程处理png的经验。
无论如何,你可以在这里找到一些库here。除了原生的Delphi PNG支持外,我认为你会在那里找到所有现有的库(当然是Delphi本地的)。

如果没有什么帮助,考虑尝试使用ImageMagick……这是图像处理的瑞士军刀,它可以在命令行中实现所有功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接