【问题标题】:C++ Reading and Editing pixels of a bitmap imageC++ 读取和编辑位图图像的像素
【发布时间】:2011-02-14 14:40:47
【问题描述】:

我正在尝试创建一个程序来读取图像(从位图开始,因为它们是最简单的),在图像中搜索特定参数(即 (255, 0, 0) 的一个像素,然后是(0, 0, 255)) 之一并以某种方式更改像素(仅在程序内,不保存到原始文件。)然后显示它。

我使用的是 Windows,偏好使用简单的 GDI,我想避免使用自定义库,只是因为我想真正了解我正在为这个测试程序做什么。

有人可以帮忙吗?以任何方式?一个网站?建议?示例代码?

谢谢

【问题讨论】:

  • 从哪里读取图像?来自磁盘还是已经以某种形式存在于内存中?
  • 从磁盘读入内存,然后检查内存版本

标签: c++ windows image


【解决方案1】:

但是,如果您所说的“位图”真的是指位图(即,只有未压缩的像素数据的原始图像文件),那就很简单了:

char *filename = "filename";
FILE *input = fopen(filename, "rb+");
if (!input)
{
    printf("Could not open input file '%s'\n", filename);
    system("PAUSE");
    return 1;
}

fseek(input, 0, SEEK_END);
size_t size = ftell(input);
rewind(input);

char *buffer = (char *) malloc(size);
if (!buffer)
{
    printf("Out of memory, could not allocate %u bytes\n", size);
    system("PAUSE");
    return 1;
}

if (fread(buffer, 1, size, input) != size)
{
    printf("Could not read from input file '%s'\n", filename);
    free(buffer);
    fclose(input);
    system("PAUSE");
    return 1;
}
fclose(input);

// we loaded the file from disk into memory now

for (size_t i = 0; (i + 3) < size; i += 4)
{
    if (buffer[i + 0] == 0xFF && buffer[i + 1] == 0x00 && buffer[i + 2] == 0x00 && buffer[i + 3] == 0x00)
    {
        printf("Pixel %i is red\n", (i / 4));
    }
}

free(buffer);

抱歉,这是 C 风格,但您可以轻松地将分配更改为 C++ 风格。不过,我个人喜欢 C 读取文件的方式。 通常,您会希望 if 语句检查像素是否为红色以作为宏/函数。这将使 if 语句类似于“if (compare_4bytes(buffer, 0xFF000000))”。

此外,这假设加载的文件完全由原始像素数据组成。如果不是这种情况,即。您读取 .bmp / .png / .jpg 或其他文件,您必须先加载然后将内存中的文件转换为原始像素数据。这将在评论中完成 “我们现在将文件从磁盘加载到内存中”。

BMP 当然是可行的(它几乎已经是原始像素数据),但大多数其他类型需要大量工作/研究。他们经常使用复杂的压缩算法。我建议您为此使用一个库,仅用于将其转换为原始像素数据。

Corona 是一个好(小)的(http://corona.sourceforge.net/),或 DevIL(http://openil.sourceforge.net/)或其他数千个 :)

【讨论】:

    【解决方案2】:

    如果“位图”是指 BMP,维基百科有一个pretty comprehensive description 的位和字节

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2018-02-19
      • 2011-02-13
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      相关资源
      最近更新 更多