Gray scale images processing in C++
如何将 C 中的图像读取为二维数组?我需要创建一个 C/C 程序,将图像(所有格式)读取为二维数组以显示像素值(0-255),将图像划分为块并使用像素块(BTC、AMBTC、MMBTC)应用不同的压缩方法) 并在不使用已设置库的情况下手动保存新图像(不得使用魔法)..
提前感谢
- 取决于图像格式、平台、编译器和许多其他因素。你能更具体一点吗?
-
这回答了你的问题了吗?在 C/C 中读取图像文件
-
看看这个stackoverflow.com/questions/33780943/…
-
这是最简单的...... stackoverflow.com/a/33777883/2836621
-
Adrian Mole ..我在 Windows 10 上使用 VS 2017 .. 没有特定的图像格式,所以如果我可以创建一个适用于所有格式的程序,那将是完美的,如果不是 JPEG 是一个好的开始..谢谢
-
@HajarAlhalabi 如果您对使用 MFC 感到满意,那么 CImage 类是您最好的朋友:它可以读取所有标准格式(GIF、JPEG、TIFF、BMP、
-
这里有一些使用 MFC 的 CImage 类的"大纲"代码,可能会对您有所帮助。我已经展示了如何使用基本的 Load 和 Save 选项,以及如何获取像素数据的"原始"数组(注意:最好转换为 32 位格式,所以您可以确定您获得的 DWORD 指针确实指向 width X height 数组 - 其他 BPP 格式可能会产生奇怪的结果):
首先,从文件加载(CImage 会知道或猜测文件扩展名的格式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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.
完成后,您可以按如下方式保存修改后的图像:
1 2 3 4 5 6
| 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\\' 数据保存到单独的内存区域 - 但是,希望这个简短的大纲可以帮助您入门。
请随时要求进一步澄清和/或解释。
-
这里有一些使用 MFC 的 CImage 类的"大纲"代码,可能会对您有所帮助。我已经展示了如何使用基本的 Load 和 Save 选项,以及如何获取像素数据的"原始"数组(注意:最好转换为 32 位格式,所以您可以确定您获得的 DWORD 指针确实指向 width X height 数组 - 其他 BPP 格式可能会产生奇怪的结果):
首先,从文件加载(CImage 会知道或猜测文件扩展名的格式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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.
完成后,您可以按如下方式保存修改后的图像:
1 2 3 4 5 6
| 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\\' 数据保存到单独的内存区域 - 但是,希望这个简短的大纲可以帮助您入门。
请随时要求进一步澄清和/或解释。
这里有一些使用 MFC 的 CImage 类的"大纲"代码,可能会对您有所帮助。我已经展示了如何使用基本的 Load 和 Save 选项,以及如何获取像素数据的"原始"数组(注意:最好转换为 32 位格式,所以您可以确定您获得的 DWORD 指针确实指向 width X height 数组 - 其他 BPP 格式可能会产生奇怪的结果):
首先,从文件加载(CImage 会知道或猜测文件扩展名的格式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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.
完成后,您可以按如下方式保存修改后的图像:
1 2 3 4 5 6
| 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\\' 数据保存到单独的内存区域 - 但是,希望这个简短的大纲可以帮助您入门。
请随时要求进一步澄清和/或解释。