gpt4 book ai didi

delphi - 如何从剪贴板保存 PngImage

转载 作者:行者123 更新时间:2023-12-03 15:06:20 27 4
gpt4 key购买 nike

如何将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com