c++ - 如何使用 C++ 从 RGB 缓冲区调整图像大小

标签 c++ linux image

我有一个 (char*)RGB 缓冲区,其中包含实际图像的数据。假设实际图像分辨率为 720x576。现在我想将其大小调整为分辨率,例如 120x90。 我怎样才能使用 https://code.google.com/p/jpeg-compressor/ 来做到这一点或者 libjpeg ?

注意:可以使用任何其他库,但应该在 Linux 中工作。

编辑:视频解码器以 YUV 格式解码帧,然后将其转换为 RGB。所有这些都发生在缓冲区中。 我需要调整 RGB 缓冲区的大小,以制作可变大小的缩略图。

感谢您提前提供帮助

最佳答案

为了实现我的目标,我做了以下工作:

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

关于c++ - 如何使用 C++ 从 RGB 缓冲区调整图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27017083/

相关文章:

c++ - C++ 中的分数加法

linux -\!在 Bash 命令中

c - Linux UART 传输问题

python - 在 Python 中进行多线程/并行处理的最简单方法

image - ionic 3 : Print image using Bluetooth printer

c++ - 计算地址差异是未定义的行为吗?

c++ - 使用多线程 boost 条件变量

css - 从本地网站 css 上的 pc 加载图像

c# - 如何使用 C# 和 ASP.NET 从网页截取 div 的屏幕截图?

c++ - linux中C/C++向其他独立进程发送中断信号