You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:24:04