2013-04-24 2 views
2

Я читал другие вопросы/ответы, подобные этим, но они либо:Изменение размера JPEG из буфера в другой буфер

  • Чтение/запись в формате 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 пожалуйста, если вы не можете доказать, что я могу получить его, чтобы изменять размер изображения в формате JPEG менее чем через неделю идти, хотя документации по CVMatrix)

+0

Возможно http://www.imagemagick.org/Magick++/ является то, что вы находясь в поиске. – Yuushi

+0

Сохраняет ли этот буфер сжатые данные и вы хотите применить к ним трансформацию или хотите управлять значениями исходных данных пикселя? – William

+0

Я не забочусь о том, чтобы самостоятельно манипулировать пикселем. Мне просто нужно применить преобразование к картине в целом, независимо от того, как это делается. – Nagadum

ответ

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

Я попробую. Я должен признать, что весь «InitializeMagick» является одной из причин, по которым я не хотел использовать ImageMagick для начала. Но я думаю, что другого выхода нет. – Nagadum

Смежные вопросы