C ++中的灰度图像处理

问题描述 投票:1回答:1

如何将C ++中的图像读取为2D数组?我需要创建一个C / C ++程序,以2D数组的形式读取图像(所有格式)以显示像素值(0-255),将图像划分为块,并使用像素块(BTC,AMBTC,MMBTC)应用不同的压缩方法),并手动保存新图像,而无需使用已设置的库(不得使用magic ++)。在此先感谢

c++ image-processing grayscale
1个回答
1
投票
以下是一些使用MFC的CImage类的“概述”代码,可能会对您有所帮助。我已经展示了如何使用基本的LoadSave选项,以及如何获取像素数据的“原始”数组(请注意:最好将其转换为32位格式,因此可以确保[ C0]指针将

确实指向DWORD数组-其他BPP格式可能会产生奇怪的结果):

首先,从文件加载(width X height将通过文件扩展名知道或猜测格式:]

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(32位无符号)将是DWORD数据(其中RGBA是“ alpha”通道-设置为零)。订购;因此,对于每个DWORD,字节将为0xBBBBGGGGRRRR0000。

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

当然,在实际程序中,您需要进行错误检查(大多数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),并且您可能会更安全地复制将“ pixbuf”数据存储到一个单独的存储区中-但希望此简短的概述将帮助您入门。

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

© www.soinside.com 2019 - 2024. All rights reserved.