【问题标题】:Resizing a jpeg from a buffer to another buffer将 jpeg 从缓冲区调整为另一个缓冲区
【发布时间】:2013-04-24 21:43:25
【问题描述】:

我阅读了与此类似的其他问题/答案,但它们要么:

  • 读/写 jpeg 文件
  • 使用 .NET

就我而言,我有一个包含 jpeg 的缓冲区(在本例中为 unsigned char*)。这意味着它看起来像这样:

FF D8 FF E0 ...

而不是

my_image.jpg

我想找到一个库来调整这个 jpeg 的大小并将输出放在另一个缓冲区中。

例子:

SuperLibrary::resize_jpeg(jpeg_buffer, resized_jpeg_buffer, 640, 480);

甚至:

SuperLibrary::Image my_jpeg = SuperLibray::Image(jpeg_buffer);
my_jpeg.resize(640,480);
my_jpeg.write(resized_jpeg_buffer);

另外,我想要一些非常简单的东西。 CImg 起初看起来很完美,但它只能从文件中加载/保存 jpeg。 (所以,请不要使用 openCV,除非你能证明我可以在不到一周的时间内通过 CVMatrix 上的文档来调整我的 jpeg 大小)

【问题讨论】:

  • 也许imagemagick.org/Magick++ 就是你要找的。​​span>
  • 此缓冲区是否存储压缩数据并且您想对其应用转换或者您想操作像素原始数据值?
  • 我不关心自己操纵 pixem。我只需要对整个图片进行转换,不管它是如何完成的。

标签: c++ jpeg image-resizing


【解决方案1】:

ImageMagick(更具体地说,Magick++ 绑定到它)将执行此操作。有一些 API 文档 here。如何做到这一点的一个例子(注意我没有编译这个来检查,所以可能有错误):

#include <Magick++.h> 
#include <iostream> 

using namespace Magick; 

int main(int argc,char **argv) 
{ 
  InitializeMagick(*argv);
  unsigned char* img_data;
  //Fill in img_data

  Blob b(img_data, image_data_len);
  Image img(b); 
  img.resize("640x480");

  Blob resized;
  master.write(resized); 

  unsigned char* img_data_resized = new unsigned_char[resized.length()];
  std::copy(resized.data(), resized.data() + resized.length(), img_data_resized);

  //Do whatever you want with resized image data...

  delete[] img_data_resized;
  return 0; 
}

【讨论】:

  • 我会试一试的。我不得不承认整个“InitializeMagick”是我一开始不想使用 ImageMagick 的原因之一。但我想没有别的办法了。
  • 多年来第一次连接到我的帐户。我可以确认 ImageMagick 正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多