如何使用 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 缓冲区调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章
在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小
使用libjpeg C ++ Library从JPEG图像中提取RGB