c++ - C++中的灰度图像处理

标签 c++ image-processing grayscale

如何将 C++ 中的图像读取为二维数组?我需要创建一个 C/C++ 程序,它将图像(所有格式)读取为二维数组以显示像素值(0-255),将图像划分为 block 并使用像素 block (BTC、AMBTC、MMBTC)应用不同的压缩方法) 并在不使用已设置库的情况下手动保存新图像(不得使用魔法++)..
提前致谢

最佳答案

这是使用 MFC 的 CImage 的一些“大纲”代码可能对您有所帮助的类(class)。我已经展示了如何使用基本的 LoadSave选项,以及如何获取“原始”像素数据数组(注意:最好转换为 32 位格式,因此您可以确定 DWORD 得到的指针确实指向 width X height 数组 - 其他BPP 格式会产生奇怪的结果):

首先,从文件加载(CImage 将从文件扩展名中知道或猜测格式):

CImage original;
original.Load("Yourfile.jpg"); // Use actual file path, obviously 

int pw = original.GetWidth(), ph = original.GetHeight(); // Dimensions
CImage working; // Use this to hold our 32-bit image
working.Create(pw, ph, 32);

// Next, copy image from original to working...
HDC hDC = working.GetDC();
original.BitBlt(hDC, 0, 0, SRCCOPY);
working.ReleaseDC();

// Get a DWORD pointer to the pixel data...
BITMAP bmp;
GetObject(working.operator HBITMAP(), sizeof(BITMAP), &bmp);
DWORD* pixbuf = static_cast<DWORD*>(bmp.bmBits);
// We can now access any pixel(x,y) data using: pixbuf[x + y * pw]

现在,您可以使用 pixbuf 对图像缓冲区进行各种处理。数组,如评论中所述。为清楚起见:每个 DWORD缓冲区中的(32 位无符号)将是 RGBA数据(其中 A 是“alpha” channel - 设置为零)但顺序相反;因此,对于每个 DWORD,字节将为 0xBBBBGGGGRRRR0000。

完成后,您可以按如下方式保存修改后的图像:

CImage savepic;
savepic.Create(pw, ph, 24); // Change 24 to whatever BPP you require
hDC = savepic.GetDC();
working.BitBlt(hDC, 0, 0, SRCCOPY); // Copies modified image to output
savepic.ReleaseDC();
savepic.Save("NewFile.jpg"); // CImage understand what format to use base on extension

当然,在实际程序中,您需要进行错误检查(大多数 CImage 方法返回状态指示符,并且可以使用 GetLastError()),并且您可能会更安全地复制 'pixbuf ' 数据到一个单独的内存区域 - 但是,希望这个简短的大纲可以帮助您入门。

随时要求进一步澄清和/或解释。

关于c++ - C++中的灰度图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59560881/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 如何从线程中取回数据?

image-processing - 在opencv中,如何将灰度图像复制并缩放到另一个彩色图像

c++ - 对 modbus_new_tcp Eclipse 的 undefined reference

java - Android 原生应用程序源代码

c++ - opencv 中的(自适应)阈值错误(cvarrToMat 中的错误参数(未知数组类型))

c - Magickwand C 改变图像颜色

python - 如何使用图像每个像素的值绘制 3d 图形?

matlab - 从灰度图像中去除异常值

image - 是否可以制作灰度 BMP 文件?