Как изменить размер изображения из буфера RGB с использованием C ++

0

У меня есть буфер (char *) RGB, который имеет данные фактического изображения. Скажем, что фактическое разрешение изображения составляет 720x576. Теперь я хочу изменить его до разрешения, скажем, 120х90. Как это сделать, используя https://code.google.com/p/jpeg-compressor/ или libjpeg?

Примечание: можно использовать любую другую библиотеку, но она должна работать в Linux.

Отредактировано: Видеодекодер декодирует кадр в YUV, который я конвертирую в RGB. Все это происходит в буфере. Мне нужно изменить размер буфера RGB, чтобы сделать из него миниатюру с переменным размером.

Спасибо за помощь в продвижении

  • 2
    Вы видели это? stackoverflow.com/questions/7488048/libjpeg-output-scaling
  • 1
    Ссылки из непринятого ответа также актуальны. То, что вы спросили, не является строго дубликатом этого вопроса, но если вы не дадите нам немного больше, вы можете счесть это закрытым как дубликат или слишком широкий!
Показать ещё 4 комментария
Теги:
image

1 ответ

0
Лучший ответ

Для достижения своей цели я сделал следующее:

#define TN_WIDTH 240
#define TN_HEIGHT 180

#include "jpegcompressor/jpge.h"
#include "jpegcompressor/jpgd.h"
#include <ippi.h>

bool createThumnailJpeg(const uint8* pSrc, int srcwidth, int srcheight)
{
int req_comps = 3;
jpge::params params;
params.m_quality = 50;
params.m_subsampling =  jpge::H2V2;
params.m_two_pass_flag = false;


FILE *fpJPEGTN = fopen("Resource\\jpegcompressor.jpeg","wb");

int dstWidth = TN_WIDTH;
int dstHeight = TN_HEIGHT;
int uiDstBufferSize = dstWidth * dstHeight * 3;
uint8 *pDstRGBBuffer = new uint8[uiDstBufferSize];
uint8 *pJPEGTNBuffer = new uint8[uiDstBufferSize];

int uiSrcBufferSize = srcwidth * srcheight * 3;

IppiSize srcSize = {srcwidth , srcheight};
IppiRect srcROI = {0, 0, srcwidth, srcheight};
IppiSize dstROISize = {dstWidth, dstHeight};
double xfactor = (double) dstWidth / srcwidth;
double yfactor = (double) dstHeight / srcheight;
IppStatus status = ippiResize_8u_C3R(pSrc, srcSize, srcwidth*3, srcROI,
    pDstRGBBuffer,  dstWidth*3, dstROISize, xfactor, yfactor, 1);

if (!jpge::compress_image_to_jpeg_file_in_memory(pJPEGTNBuffer, uiDstBufferSize, dstWidth, dstHeight, req_comps, pDstRGBBuffer, params))
{
    cout << "failed!";
    delete[] pDstRGBBuffer;
    delete [] pJPEGTNBuffer;
    return false;
}
if (fpJPEGTN)
{
    fwrite(pJPEGTNBuffer, uiDstBufferSize, 1, fpJPEGTN);
    fclose(fpJPEGTN);
}   
delete [] pDstRGBBuffer;
delete [] pJPEGTNBuffer;

return true;
}
  • 0
    Разве вы не сказали C ++? Примечание для других, приезжающих сюда: Пожалуйста, используйте умные указатели, std :: fstreams (или лучше: compress_image_to_jpeg_file ) и проверьте коды возврата ( status ), чтобы сделать этот безопасный код C ++.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню