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

Posted

技术标签:

【中文标题】如何使用 c++ 从 rgb 缓冲区调整图像大小【英文标题】:How to resize an image from an rgb buffer using c++ 【发布时间】:2014-11-19 12:40:44 【问题描述】:

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

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

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

提前感谢您的帮助

【问题讨论】:

你见过这个吗? ***.com/questions/7488048/libjpeg-output-scaling 未接受的答案中的链接也是相关的。您提出的问题严格来说并不是该问题的重复内容,但除非您再给我们更多信息,否则您可能会发现此问题已关闭为重复内容或过于宽泛! 实际上我需要从包含图像 RGB 数据的缓冲区生成可变大小的缩略图。我可以使用 jpeg-compressor 中的“compress_image_to_jpeg_file_in_memory”api 转储图像,但无法调整图像大小。 Sooooo...我刚刚链接到你的那个关于使用 libjpeg 调整图像大小的问题有帮助吗? 感谢您的链接..它以某种方式将我引向了我的答案。我使用英特尔 ippi 函数来调整缓冲区大小,而不是使用 libjpeg。此外,jpeg 压缩 + Intel ipp 比使用 libjpeg 更轻巧。感谢您的帮助! 【参考方案1】:

我做了以下事情来实现我的目标:

#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++吗?其他人请注意:请使用智能指针、std::fstreams(或更好的:compress_image_to_jpeg_file)并检查返回码(status)以确保此 C++ 代码安全。

以上是关于如何使用 c++ 从 rgb 缓冲区调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

nodejs从远程服务器调整大小并保存图像

在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小

使用libjpeg C ++ Library从JPEG图像中提取RGB

如何将 rgb 图像数组从 sws_scale 转换为 DIB(在内存位图中)

matlab如何让调整保存图像的大小

调整图像类型“Mat”opencv C++的大小