我嘗試將元資料添加到現有的 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;
知道我做錯了什么嗎?
uj5u.com熱心網友回復:
根據檔案,第 76 頁,不支持EXIF_MAIN向 a寫入表 13JPEG - 僅讀取是:
| FIF_JPEG | FIF_TIFF | FIF_PNG | FIF_GIF | FIF_RAW | FIF_JXR | FIF_WEBP | |
|---|---|---|---|---|---|---|---|
| 0 = FIMD_COMMENTS | 讀/寫 | —— | 讀/寫 | 讀/寫 | —— | —— | —— |
| 1 = FIMD_EXIF_MAIN | 電阻 | 讀/寫 | —— | —— | 電阻 | 讀/寫 | 電阻 |
| 2 = FIMD_EXIF_EXIF | 電阻 | 電阻 | —— | —— | 電阻 | 讀/寫 | 電阻 |
| 3 = FIMD_EXIF_GPS | 電阻 | —— | —— | —— | 電阻 | 讀/寫 | 電阻 |
| 4 = FIMD_EXIF_MAKERNOTE | 電阻 | —— | —— | —— | 電阻 | 電阻 | 電阻 |
| 5 = FIMD_EXIF_INTEROP | 電阻 | —— | —— | —— | 電阻 | 電阻 | 電阻 |
| 6 = FIMD_IPTC | 讀/寫 | 讀/寫 | —— | —— | —— | 讀/寫 | —— |
| 7 = FIMD_XMP | 讀/寫 | 讀/寫 | 讀/寫 | —— | —— | 讀/寫 | 讀/寫 |
| 8 = FIMD_GEOTIFF | —— | 讀/寫 | —— | —— | —— | —— | —— |
| 9 = FIMD_影片 | —— | —— | —— | 讀/寫 | —— | —— | —— |
| 10 = FIMD_CUSTOM | —— | —— | —— | —— | —— | —— | —— |
| 11 = FIMD_EXIF_RAW | 讀/寫 | —— | —— | —— | —— | —— | 讀/寫 |
這意味著:如果您將其保存為 ie,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 圖片的寫入支持。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/351735.html
上一篇:重用ElasticBeanstalk資源在第二個云形成堆疊中的一個云形成堆疊中創建
下一篇:參考程式和自我
