将jpeg从缓冲区调整为另一个缓冲区

时间:2013-04-24 12:51:23

标签: c++ jpeg image-resizing

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

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

在我的例子中,我有一个缓冲区(在这个例子中,是一个unsigned char *),它包含一个jpeg。这意味着它看起来像:

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大小)

1 个答案:

答案 0 :(得分:0)

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; 
}