如何将C ++中的图像读取为2D数组?我需要创建一个C / C ++程序,以2D数组的形式读取图像(所有格式)以显示像素值(0-255),将图像划分为块,并使用像素块(BTC,AMBTC,MMBTC)应用不同的压缩方法),并手动保存新图像,而无需使用已设置的库(不得使用magic ++)。在此先感谢
CImage
类的“概述”代码,可能会对您有所帮助。我已经展示了如何使用基本的Load
和Save
选项,以及如何获取像素数据的“原始”数组(请注意:最好将其转换为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”数据存储到一个单独的存储区中-但希望此简短的概述将帮助您入门。随时要求进一步的澄清和/或解释。