【问题标题】:Finding xy position of a bitmap查找位图的 xy 位置
【发布时间】:2014-05-14 12:29:15
【问题描述】:

我写了一个函数来获取请求的像素位置(x250 y230 - 整个图片的中心 - x500 y460)。问题是该函数返回的位置在上方相差 17 像素,而在右侧则相差 12 像素。我错过了什么……垫子?如何正确使用此功能?

size_t find (FILE* fp, dword xp, dword yp)
{
    int i;
    int pointer = (sizeof(DIB)+sizeof(BMP)+2)+(250*3);

    for(i=0; i<460; i++)
    {
        fseek(fp, pointer+(i*pointer), SEEK_SET);
    }
     return ftell(fp);
}

【问题讨论】:

  • 我认为您可能确实在计算中遗漏了填充字节。我做过一次,当我尝试绘制它们时,我的位图是“斜体”。
  • 是的,但问题是我如何在这个函数中实现填充。
  • 您必须在位图文件中找到像素表(从位图标题,更多信息here)并使用行大小公式here 乘以您的行号来查看它yp,将您的列号 xp 乘以一个像素的大小。
  • 我..只是无法理解。
  • 好吧,别担心,我会在答案中说明并尝试更加明确和清晰。

标签: c bitmap position pixel


【解决方案1】:

正如我在 cmets 中所说,您确实缺少填充,但不仅如此。

bitmap file is composed of multi parts:标题、颜色图和像素图(主要是)。

根据我对您的问题的理解,您需要您的函数返回位于xp ; yp 位置的像素的文件 fp(被认为是位图文件)中的偏移地址。为此,您至少需要三件事:

  • 像素图开始的偏移量:你可以通过读取Bitmap file header的最后4个字节(dword)找到它,你可以通过读取文件中的偏移量10得到它。
  • 每行像素数(或图像宽度):您可以在 BITMAPINFOHEADER 中找到它
  • 每像素位数:您可以在 BITMAPINFOHEADER 中找到它

当你有这个时,你的像素在文件中的地址是:

rowSizeInBytes = (((bitPerPixel * imageWidth + 31) * 4) / 32);
pixAddress = pixelMapStartAddress + rowSizeInBytes * yp + ((xp * bitPerPixel) / 8);

【讨论】:

  • 似乎可以在高度上工作,但我放在该地址上的像素几乎在图片宽度的末尾。
  • 当我使用 fseek(fp, find(fp, 1, 230), SEEK_SET); 并在该地址中放置一个像素时,该像素已在 230x229 中看到。
  • “像素已被看到”是什么意思?
  • 输出像素。它的 x 必须在中间。 byte pixel[] = {255, 255, 255}; fseek(fp, find(250, 230), SEEK_SET); fwrite(&amp;pixel, 1, sizeof(pixel), fp); 这是我用来把像素放在中间的函数。
  • 是的,这就是重要的原因!如果您不从文件中获取正确的值,您怎么能期望在文件中获得正确的值? bpx 和 offset 不重要,否则不会写在 header 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多