使用Delphi 11配合FreeImage无法为JPEG图片添加Metadata问题求助
问题核心原因
- 保存JPEG文件时未开启EXIF写入开关
FreeImage 保存JPEG格式文件时默认不会将内存中修改的EXIF元数据写入输出文件,你代码中FreeImage_SaveU的第四个参数传入了0,没有指定JPEG_SAVE_EXIF标志,导致添加的Artist标签没有被写入新文件。 - 存在内存泄漏缺陷
你通过FreeImage_CreateTag创建的标签对象使用完成后未调用FreeImage_DeleteTag释放,虽不直接导致元数据写入失败,但属于代码隐患。
修正后的完整代码
只需要修改FreeImage_SaveU的参数,同时补充标签释放逻辑即可:
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; Tag := 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; // 修改保存参数,添加JPEG_SAVE_EXIF标志 if not FreeImage_SaveU(FIF_JPEG, dib, PChar(ChangeFileExt(FileName, '_2.jpg')), JPEG_SAVE_EXIF) then Exit; Success := TRUE; finally // 释放创建的标签对象 if Tag <> nil then FreeImage_DeleteTag(Tag); if dib <> nil then FreeImage_Unload(dib); if Success then WriteLn('Success') else WriteLn('Failed'); end; end;
如果部分FreeImage Delphi封装版本未预定义JPEG_SAVE_EXIF,可以手动替换为对应常量值128(即0x80)。
内容的提问来源于stack exchange,提问作者fpiette
相关产品推荐
相关产品推荐

