如何将 pngimage 保存到从 AdobeFirewoks(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/