gpt4 book ai didi

libjpeg - 将 libexif 与 libjpeg 结合使用以在现有 JPEG 上设置 exif 标签

转载 作者:行者123 更新时间:2023-12-05 04:08:05 38 4
gpt4 key购买 nike

在我的 C 程序中,我想使用 libexiflibjpeg 在给定路径 inputFilePath ,并将生成的 jpeg 保存到输出路径 outputFilePath

输入的 jpeg 文件很大(40000 X 40000 像素),因此将整个图像加载到内存中并不可取,也不需要。

我不关心 Jpeg 中其他现有的 Exif 标签,它们可能会被删除。

我已阅读并尝试使用固定 JPEG 的 libexif 提供的示例,但无法弄清楚如何对任何 JPEG 执行相同的操作。

顺便说一句,我确实得到了以下代码,它通过加载 jpeg in-memory 来设置 exif 标签。它使用随 libexif 一起提供的 exif 实用程序中提供的 libjpeg 实现。

ExifEntry *entry;
ExifData *exif = exif_data_new();
if (!exif) {
//Out of memory
}

/* Set the image options */
exif_data_set_option(exif, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
exif_data_set_data_type(exif, EXIF_DATA_TYPE_COMPRESSED);
exif_data_set_byte_order(exif, FILE_BYTE_ORDER);

/* Create the mandatory EXIF fields with default data */
exif_data_fix(exif);

/* All these tags are created with default values by exif_data_fix() */
/* Change the data to the correct values for this image. */
entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_PIXEL_X_DIMENSION);
exif_set_long(entry->data, FILE_BYTE_ORDER, w);

entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_PIXEL_Y_DIMENSION);
exif_set_long(entry->data, FILE_BYTE_ORDER, h);

entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_COLOR_SPACE);
exif_set_short(entry->data, FILE_BYTE_ORDER, 1);

/* Create a EXIF_TAG_USER_COMMENT tag. This one must be handled
* differently because that tag isn't automatically created and
* allocated by exif_data_fix(), nor can it be created using
* exif_entry_initialize() so it must be explicitly allocated here.
*/
entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_USER_COMMENT,
sizeof(ASCII_COMMENT) + sizeof(FILE_COMMENT) - 2);
/* Write the special header needed for a comment tag */
memcpy(entry->data, ASCII_COMMENT, sizeof(ASCII_COMMENT) - 1);
/* Write the actual comment text, without the trailing NUL character */
memcpy(entry->data + 8, FILE_COMMENT, sizeof(FILE_COMMENT) - 1);
/* create_tag() happens to set the format and components correctly for
* EXIF_TAG_USER_COMMENT, so there is nothing more to do. */

JPEGData *jdata;
unsigned char *d = NULL;
unsigned int ds;
ExifLog *log = NULL;

/* Parse the JPEG file. */
jdata = jpeg_data_new();
jpeg_data_log(jdata, log);
jpeg_data_load_file(jdata, inputFilePath);

/* Make sure the EXIF data is not too big. */
exif_data_save_data(exif, &d, &ds);
if (ds) {
free(d);
if (ds > 0xffff)
//Too much EXIF data
};

jpeg_data_set_exif_data(jdata, exif);

/* Save the modified image. */
jpeg_data_save_file(jdata, outputFilePath);
jpeg_data_unref(jdata);

最佳答案

如果您不重新压缩或编辑图像,则不需要 libjpeg .可以用 fopen 来完成和 fputc .

exiv2 中对 JPEG 文件结构和元数据有很好的描述。 .大多数 jpeg 文件将以 0xFFD8 开头(图像开始),然后是 APP0 JFIF 数据 block ( 0xFF E0 <length> <data> )。如果有 EXIF header ,它在 APP1 中 block (0xFF E1 <length> <data>)。

JPEG 文件中的 block 被格式化为

  • 标记 ( 0xFF xx ) 其中 xxEn对于 APPn block
  • 内容

    • 2 字节 - 以字节为单位的内容长度包括这 2 个字节
    • 数据

所以,你的程序大纲是

  1. 复制文件直到 APP1阻止
  2. 写下您的 APP1阻止
  3. 复制文件的其余部分

可以使用 exif_data_save_data() 创建 EXIF header 内容在 libexif .

关于libjpeg - 将 libexif 与 libjpeg 结合使用以在现有 JPEG 上设置 exif 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48077371/

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