Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中从磁盘读取位图的小节#_C#_Image_Image Manipulation - Fatal编程技术网

C# 在C中从磁盘读取位图的小节#

C# 在C中从磁盘读取位图的小节#,c#,image,image-manipulation,C#,Image,Image Manipulation,我正在为我的智能手机编写一些地图软件,遇到了一个问题,我不想在只显示一部分的情况下将所有(大)图像文件加载到内存中 如果您知道x和y偏移和宽度,是否有办法只读取大图像的一部分(可视部分)?我知道可能是通过一次读取一个字节的文件来实现的,但我不确定如何做到这一点 谢谢,, Nico这至少在一定程度上取决于图像的保存格式。如果您有原始图像文件或位图,这是可能的,但是如果您的数据以任何方式压缩,例如JPEG或PNG,那么仅读取一部分就会困难得多。如果您确实不想将完整数据加载到内存中,则必须编写自己的I

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

如果您知道x和y偏移和宽度,是否有办法只读取大图像的一部分(可视部分)?我知道可能是通过一次读取一个字节的文件来实现的,但我不确定如何做到这一点

谢谢,,
Nico

这至少在一定程度上取决于图像的保存格式。如果您有原始图像文件或位图,这是可能的,但是如果您的数据以任何方式压缩,例如JPEG或PNG,那么仅读取一部分就会困难得多。

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

您不能事先将图像分割成多个部分吗


将其拆分为多个256x256像素的图像意味着您只需加载其中的两个图像,然后将它们重新缝合到可视画布上。举一个例子——谷歌地图使用这种技术。

这是我用位图做的

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

如果是BMP文件,就不会那么难了

首先从文件中读取头,如果我没记错的话,它是44个字节,但是您可以通过搜索web来查找规范

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


FileStream
类具有您需要的功能;
Read
读取方法和
Seek
跳转到给定位置的方法。

我甚至可以说这是正确的解决方案。试着让你的图像尺寸保持两边的二次方(可能是256x256或512x512)。我已经有了组成大图像的256x256块。我将它们组合成一幅图像,这样我就可以通过gps地图软件将其转换成具有正确纵横比的gps地图。我想我可以使用lat和long来确定要加载哪个256x256块。不过,我需要做一些数学方面的阅读,这就是为什么我首先将这一部分委托给gps地图软件:)但你永远不想将资源以未压缩格式存储在内存有限的设备上(或者可能永远不会)。这是一种空间浪费,从磁盘/闪存加载要慢得多。感谢所有回复!我也会看看这个方法。基本上,我已经将大量256x256块拼接成了一个大图像。然后我遇到了一个问题:从我的gps接收器中获取lat/long数据,并决定在屏幕上显示哪个图像块。为此,我将小图像缝合成一个大图像,这样我就可以通过第三方工具运行它,该工具生成了一个.map文件,并应用了正确的lat/long变换(在使用少量已知点进行校准之后)。我会继续纠缠它,但我可能会变得懒惰,使用一些现有的地图,而不是在最后一条评论的空间外的马兰。感谢所有的反馈,我会尽量保留较小的块。然后,挑战将是根据gps坐标来决定使用哪种坐标。我必须写一些从lat/long到我想象的像素的转换,这需要首先加载完整的位图