delphi - 如何从剪贴板保存 PngImage

标签 delphi png transparency clipboard

如何将 pngimage 保存到从 Adob​​eFirewoks(Clipboard) 或 Photoshop 复制的文件而不丢失透明度。

我使用的是delphi2009。

提前谢谢您。

@TLama 我尝试了这段代码,但没有透明度。我也不知道我这样做是否正确。

  png := TPngimage.Create;
  try
    png.LoadFromClipboardFormat(CF_BITMAP,
      Clipboard.GetAsHandle(CF_BITMAP), CF_BITMAP);
    image1.Picture.Assign(png);
  finally
    png.Free;
  end;

最佳答案

Photoshop 的剪贴板格式很糟糕。包含存储到剪贴板中的 Alpha channel 的唯一相当有效的数据是......猜猜? ...指向“Photoshop 粘贴到位” block 中 Alpha channel 内存的指针...太可怕了。如果你复制一些东西然后重新启动 Photoshop,Alpha 就会丢失:)

但是,您可以轻松了解剪贴板是否包含 Photoshop 图像。

询问剪贴板有哪些 block 。

如果剪贴板有两个 block ,分别名为“Photoshop Paste In Place”“对象描述符”,则您可以 99.9% 确定系统上的 Photoshop 正在运行并且剪贴板包含对 Photoshop 数据的引用。 (当 Photoshop 退出时,对象描述符 block 将从剪贴板中删除,因此 Alpha 会永远丢失)

那么,你有两个选择:

选择 1(不推荐):打开 Photoshop 的进程内存并从指针读取原始 32 位图像数据...这样做总体来说很愚蠢,而且不安全、

选择 2(推荐):使用 COM 从 Photoshop 中提取图像数据。当然,COM方式是最好的方式。让您的程序生成并运行以下 VBS 脚本:

On Error Resume Next
Set Ps = CreateObject("Photoshop.Application")
Set Shell = CreateObject("WScript.Shell")
Set FileSystem = CreateObject("Scripting.FileSystemObject") 

Dim PNGFileName
PNGFileName = Shell.CurrentDirectory & "\psClipboard.png"

If FileSystem.FileExists(PNGFileName) Then 
    FileSystem.DeleteFile PNGFileName
End If

Set Doc = Ps.Documents.Add(1,1,72,"psClipboard",,3)

Doc.Paste()
Doc.RevealAll()

If Err.Number = 0 Then 
    set PNGSaveOptions = CreateObject("Photoshop.PNGSaveOptions")
    doc.saveAs PNGFileName, PNGSaveOptions
End If

doc.Close()

在脚本的当前目录中,将生成一个名为“psClipboard.png”的文件。使用 libPng 或其他方式在程序中读取此文件,就像它来自剪贴板一样。该脚本将删除 psClipboard.png,然后向 Photoshop 请求它。如果粘贴返回错误,脚本将停止并且不会生成文件,在这种情况下,剪贴板不包含有效的 Photoshop 引用数据。

关于delphi - 如何从剪贴板保存 PngImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12258519/

相关文章:

python - 如何在 Ubuntu 11.10 上使用 ZIP、JPEG 等安装 PIL

.net - WinForms 中具有 alpha channel 透明度/不透明度的启动屏幕

ios - view.alpha = 0 与 view.hidden = YES 有什么影响?

delphi - TDBNavigator背景透明度颜色错误

德尔福通用框架

python - png24 到 png8 转换

transparency - 动画加载 GIF

德尔福XE2 : iterate actions in a TAcionManager object

delphi - 我应该如何在 Delphi 7 析构函数中释放对象数组?

css - 具有流体高度的 PNG 阴影