代码之家  ›  专栏  ›  技术社区  ›  Nick

在C中从磁盘读取位图的分区#

  •  3
  • Nick  · 技术社区  · 17 年前

    我正在为我的智能手机编写一些地图软件,遇到了一个问题,即我不想在只显示一部分图像时将所有(大)图像文件加载到内存中。

    如果你知道X和Y偏移量和宽度,有没有办法只读取一个大图像的一个子区域(可视部分)?我知道可能一次读取一个字节的文件,但我不知道怎么做。

    谢谢您, 尼科

    5 回复  |  直到 17 年前
        1
  •  2
  •   Paul Sonier    17 年前

    这至少在一定程度上取决于你的图像是以何种格式保存的。如果你有原始的图像文件或位图,这是可能的,但如果你的数据是以任何方式压缩,如jpeg或png,它将是非常困难的阅读只是一个小节。

        2
  •  1
  •   Sam Harwell    17 年前

    如果您真的不想将完整的数据加载到内存中,则必须编写自己的IO例程来读取文件。对于任何比bmp更复杂的内容,解压算法都可能变得复杂。

        3
  •  1
  •   Guffa    17 年前

    如果是BMP文件,应该没那么难。

    首先,从文件中读取头,如果我没记错的话,它是44字节,但是您可以从搜索web上的规范中找到这一点。

    页眉包含的信息包括每像素有多少字节、总宽度和高度、每扫描行有多少字节。通常位图是颠倒存储的,因此您可以计算文件中底线的第一个像素所在的位置并跳到该位置。然后从该行读取所需的像素,并跳到下一行的正确像素。

    这个 FileStream 班上有你需要的东西;a Read 阅读方法和 Seek 方法跳转到给定位置。

        4
  •  1
  •   Dale Reidy    17 年前

    你不能事先把图像分成几部分吗?

    将其分割成许多256x256像素的图像意味着您只需加载其中的一些图像,然后将它们缝合在可查看的画布上。举个例子,google maps使用了这种技术。

        5
  •  0
  •   William Edmondson    17 年前

    这是我用位图做的…

    public BitmapCropBitmap(BitMap fullBitmap, Rectangle rectangle)
    {
      return proBitmap.clone(fullBitmap, rectangle, fullBitmap.PixelFormat);
    }
    
    推荐文章