我可以将使用libjpeg 的jpeg 解压缩的输出设置为一定的宽度和高度吗?

Can I set the output of jpeg decompression using libjpeg to certain width and height?

我想解码 jpeg 图像,我正在使用 libjpeg 来实现。 流程是: 输入图像->选项1.Resize+解码,选项2.decode+调整大小->输出

在上面的流程中,我应该选择哪个选项?

我可以将输出的解压缩图像调整为特定的宽度和高度,例如 416x416 吗?

旁注:在浏览文档时,我遇到了参数 output_width 和 output_height,我可以修改它们吗? 我指的文档:DOC 线路:631-641

如果不先对 JPEG 进行解码,则无法调整它的大小。所以选项 2 是您唯一的选择。使用 libjpeg 解码后,您需要调整图像大小。你需要自己写一个算法,或者使用另一个库。 libjpeg 不会那样做。

如果您想以新的尺寸存储它,您可以再次使用libjpeg 对生成的图像进行编码。在这种情况下,您可以(并且必须)设置 output_widthoutput_height。这实际上并没有改变大小——它告诉 libjpeg 您要编码的图像有多大。

是的,您可以在解压缩图像的同时缩放图像,但只能缩放其实际尺寸的倍数(或约数)。

反正它是有用的,我就是这么用的。我想生成更大图片的缩图(缩略图),所以我选择了可​​用的最小尺寸;输出更小,内存更少,调整大小需要处理的像素更少,并且根据情况甚至解码步骤可以更快。

我手边没有这些资源,但今晚我可以搜索以提供更多详细信息。

-- 更新-- 我在我的旧资源 (pascal) 中发现了以下内容:

  cinfo.scale_num := 1;
  cinfo.scale_denom := 1;   { 1:1 scaling }
  ...
  cinfo.two_pass_quantize := TRUE;

  { Step 5: Start decompressor }

  jpeg_start_decompress(@cinfo);

如您所见,在解压缩时应用了缩放工具;据我所知,它在请求原始图像的 1/2、1/4、1/8 等时效果很好。

在另一个程序中,我发现:

  sc := round(width/IconRect.right/(fmOptions.cbThumbQuality.ItemIndex+1));
  if sc>ord(jsEighth) then sc := ord(jsEighth);
  scale := TJpegScale(sc);

上面的代码片段计算了将原始图像缩小多少以获得“图标”(或微型)宽度,但将缩放比例限制为 1/8:我记得,但我不确定,这个限制来自 jpeg 库。另一方面,jpeg 库已经发展,也许它现在具有更多功能。

综上所述,您可以设置缩放模式,但不能设置最终维度;设置比例后,output_width 将反映最终宽度,无论如何,这是为库的解压缩例程分配内存所必需的。

希望对您有所帮助。