C++中的灰度图像处理

Gray scale images processing in C++

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

下面是一些使用 MFC CImage class 的 'outline' 代码,可能会对您有所帮助。我已经展示了如何使用基本的 LoadSave 选项,以及如何获取 'raw' 像素数据数组(注意:最好转换为 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”通道 - 设置为零) 颠倒了顺序;因此,对于每个 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 方法 return 是状态指示器,GetLastError() 可以是used),并且将 'pixbuf' 数据复制到单独的内存区域可能更安全 - 但是,希望这个简短的大纲能帮助您入门。

随时要求进一步澄清and/or解释。