【问题标题】:Gray scale images processing in C++C++中的灰度图像处理
【发布时间】:2020-01-02 21:33:58
【问题描述】:

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

【问题讨论】:

  • 取决于图像格式、平台、编译器和许多其他因素。能具体一点吗?
  • 这能回答你的问题吗? Reading an image file in C/C++
  • @HajarAlhalabi 如果您对使用MFC 感到满意,那么CImage 类是您最好的伙伴:它可以读取所有标准格式(GIF、JPEG、TIFF、BMP 等)并且具有使访问原始像素缓冲区相对变得容易的成员函数。我可以给你一些示例代码,如果这是你乐意采取的方向。
  • @Close-Voter:OP 不是在寻找图书馆或场外资源,本身。事实上,他们声明:“不使用已经设置的库!”

标签: c++ image-processing grayscale


【解决方案1】:

这里有一些使用 MFC 的 CImage 类的“大纲”代码,可能会对您有所帮助。我已经展示了如何使用基本的 LoadSave 选项,以及如何获取“原始”像素数据数组(注意:最好转换为 32 位格式,这样您就可以确定 @你得到的 987654324@ 指针将真的指向一个 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 方法返回状态指示符,并且可以使用GetLastError()),并且您可能会更安全地复制'pixbuf' 数据到一个单独的内存区域 - 但是,希望这个简短的大纲可以帮助您入门。

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

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 2021-04-21
    • 2015-09-09
    • 2011-12-25
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2022-01-12
    • 2015-06-28
    相关资源
    最近更新 更多