gpt4 book ai didi

delphi - 无法使用 FreeImage 将元数据添加到 JPEG 图像

转载 作者:行者123 更新时间:2023-12-03 08:14:28 26 4
gpt4 key购买 nike

我尝试将元数据添加到现有 JPEG 文件并将图像保存到另一个文件中。我正在使用 Delphi 11 和 FreeImage(Delphi 包装器)。生成的图像与现有图像相同,没有添加元数据标签。完全没有错误。

以下是重现该问题的简单独立过程:

procedure AddTagArtistTest;
var
fif : FREE_IMAGE_FORMAT;
dib : PFIBITMAP;
Tag : PFITAG;
TagValue : AnsiString;
TagKey : AnsiString;
TagID : WORD;
Filename : String;
Success : Boolean;
begin
Filename := 'F:\Images\ExistingImage.jpg'; // Already has metadata but no TAG_ARTIST
dib := nil;
Success := FALSE;
try
fif := FreeImage_GetFileTypeU(PChar(FileName), 0);
if fif = FIF_UNKNOWN then
fif := FreeImage_GetFIFFromFilenameU(PChar(FileName));
if fif = FIF_UNKNOWN then
Exit;
if not FreeImage_FIFSupportsReading(fif) then
Exit;
dib := FreeImage_LoadU(fif, PChar(Filename), 0);
if dib = nil then
Exit;
Tag := FreeImage_CreateTag();
TagValue := 'FRANCOIS PIETTE';
TagKey := 'Artist';
TagID := $013B; // TAG_ARTIST;
if not FreeImage_SetTagID(Tag, TagID) then
Exit;
if not FreeImage_SetTagKey(Tag, PAnsiChar(TagKey)) then
Exit;
if not FreeImage_SetTagType(Tag, FIDT_ASCII) then
Exit;
if not FreeImage_SetTagLength(Tag, Length(TagValue) + 1) then
Exit;
if not FreeImage_SetTagCount(Tag, Length(TagValue) + 1) then
Exit;
if not FreeImage_SetTagValue(Tag, PAnsiChar(TagValue)) then
Exit;
if not FreeImage_SetMetadata(FIMD_EXIF_MAIN,
dib,
PAnsiChar(TagKey),
Tag) then
Exit;
if not FreeImage_SaveU(FIF_JPEG,
dib,
PChar(ChangeFileExt(FileName, '_2.jpg')),
0) then
Exit;
Success := TRUE;
finally
if dib <> nil then
FreeImage_Unload(dib);
if Success then
WriteLn('Success')
else
WriteLn('Failed');
end;
end;

知道我做错了什么吗?

最佳答案

根据 the documentation, page 76, Table 13写作EXIF_MAINJPEG不支持 - 只能读取:

<表类=“s-表”><标题>FIF_JPEGFIF_TIFFFIF_PNGFIF_GIFFIF_RAWFIF_JXRFIF_WEBP <正文>0 = FIMD_COMMENTS读/写-读/写读/写---1 = FIMD_EXIF_MAIN R读/写--R读/写R2 = FIMD_EXIF_EXIFRR--R读/写R3 = FIMD_EXIF_GPSR---R读/写R4 = FIMD_EXIF_MAKERNOTER---RRR5 = FIMD_EXIF_INTEROPR---RRR6 = FIMD_IPTC读/写读/写---读/写-7 = FIMD_XMP读/写读/写读/写--读/写读/写8 = FIMD_GEOTIFF-读/写-----9 = FIMD_ANIMATION---读/写---10 = FIMD_CUSTOM-------11 = FIMD_EXIF_RAW读/写-----读/写

这意味着:如果您将其另存为 FIF_TIFF您将获得一张包含新设置的元数据的图片。只需将您的代码更改为:

        if not FreeImage_SaveU(FIF_TIFF,
dib,
PChar(ChangeFileExt(FileName, '_2.tif')),
0) then

并且不要忘记再次释放标签:

FreeImage_DeleteTag( Tag );

使用 FreeImage 3.18.0 和 D7 成功测试了这一点。一个反例是使用 IPTC 或 XMP 而不是 EXIF,因为它们具有对 JPEG 图片的写入支持。

关于delphi - 无法使用 FreeImage 将元数据添加到 JPEG 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69872943/

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