gpt4 book ai didi

ios - JPEG 保存到 ios 照片库后 DCT 系数发生变化

转载 作者:行者123 更新时间:2023-11-29 13:23:24 24 4
gpt4 key购买 nike

将 JPEG 图像保存到 iOS 照片库时有一个奇怪的变化。我不知道我是否做错了什么。我正在使用 libjpeg-turbo 访问 JPEG 图像,然后修改图像的 DCT 系数。修改后的图像(仅在 DCT 中,没有其他)保存在照片库中。但是打开保存的图像后,DCT系数与我在上一步中更改的不一样。

让我详细解释一下我是如何为每个 DCT 添加 +1 的。我正在使用 libjpeg 库的“example.c”中的标准程序:

struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
FILE * infile;

if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
return 0;
}

cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;

if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}

jpeg_create_decompress(&cinfo);

jpeg_stdio_src(&cinfo, infile);

(void) jpeg_read_header(&cinfo, TRUE);

jvirt_barray_ptr* coeffs_array;
coeffs_array = jpeg_read_coefficients(&cinfo);

BOOL done = FALSE;
for (int ci = 0; ci < 3; ci++)
{
JBLOCKARRAY buffer_one;
JCOEFPTR blockptr_one;
jpeg_component_info* compptr_one;
compptr_one = cinfo.comp_info + ci;

for (int by = 0; by < compptr_one->height_in_blocks; by++)
{
buffer_one = (cinfo.mem->access_virt_barray)((j_common_ptr)&cinfo, coeffs_array[ci], by, (JDIMENSION)1, FALSE);

for (int bx = 0; bx < compptr_one->width_in_blocks; bx++)
{
blockptr_one = buffer_one[0][bx];

for (int bi = 0; bi < 64; bi++)
{
blockptr_one[bi]++;
}
}
}
}

write_jpeg(output, &cinfo, coeffs_array); // saving modified JPEG to the output file

jpeg_destroy_decompress(&cinfo);
fclose(infile);

在此之后,我在文件中保存了一个新的 JPEG 图像,假设为“new.jpg”。现在我想将这个“new.jpg”保存到照片库中,所以我通过以下方式加载图像:

imageToSave = [UIImage imageWithContentsOfFile:outputFile];

我还检查了 DCT 系数是否保持不变。在我检查修改后的 DCT 后得到相同的图像,然后我将保存它:

UIImageWriteToSavedPhotosAlbum(imageToSave, nil, nil, nil);

图片“new.jpg”现在保存在图片库中。

到现在为止,一切都很好,DCT 系数的工作方式与 libjpeg 库一样。当我再次加载保存的图像并查看 DCT 系数时,变化就出现了。我发现 DCT 发生了变化,但我不知道为什么。当你想保存 JPEG 图像时,iOS 是否使用任何优化算法?为什么 DCT 会发生变化。

我正在使用以下过程来读取保存的图像:

NSData *jpegData = UIImageJPEGRepresentation([info objectForKey:UIImagePickerControllerOriginalImage], 1);
[jpegData writeToFile:file atomically:YES]; // saved image is saved in file and I can use the procedure from above to check DCTs

此外,这是一个原始 DCT 的示例,通过对所有 DCT 添加 +1 修改 DCT,并在将其保存到照片库后加载一个 8x8 block 的 DCT:

Original DCTs:
-759 -24 -8 1 -1 0 0 1
56 -27 -10 1 0 1 0 0
8 0 0 0 0 -1 0 0
0 0 0 -1 0 -1 0 -1
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 -1 0 0 0 0

Modified DCTs by libjpeg:
-758 -23 -7 2 0 1 1 2
57 -26 -9 2 1 2 1 1
9 1 1 1 1 0 1 1
1 1 1 0 1 0 1 0
1 1 1 2 1 1 1 1
1 1 1 2 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1

DCTs after saving JPEG to photo library:
-758 -22 -7 2 0 0 0 0
58 -26 -8 3 0 0 0 0
8 2 0 0 -1 1 0 0
2 3 0 0 0 0 0 0
2 1 -1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 -1

如有任何帮助,我们将不胜感激。我真的不知道为什么在将图像保存到照片库后 DCT 会发生变化。

最佳答案

当您使用 UIImage 及其方法时,iOS 将始终重新压缩您的 JPEG,从而改变 DCT。相反,使用 AssetsLibrary 将用户的图片存储和检索为 NSData。此行为未记录,但有效。

我还建议将 .jpeg 存储在临时文件夹中,然后将其提供给 libjpeg-turbo。

关于ios - JPEG 保存到 ios 照片库后 DCT 系数发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13799147/

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