我们有一个应用程序可以显示来自本地网络资源的大型图像文件(卫星图像)。为了加快图像渲染速度,我们将图像划分为更小的块(例如6x6 厘米),应用程序会适当地平铺它们。但每次卫星图像更新时,都需要进行分割预处理,这是一项耗时的工作。

我想知道如何从原始文件中加载补丁?

PS 1:我找到了 LeadTools 库, ,但我们需要一个开源解决方案。

PS 2:该应用程序采用 .NET C# 语言

编辑1:格式对我们来说不是重点,但目前是 JPG。可以考虑更改为其他格式,但 BMP 格式很难接受,因为它体积大。

有帮助吗?

解决方案

我沃特回答你的问题一个美丽的尝试,但我的浏览器把它吃了...:(

基本上我试图说的是:

1.-由于JPEG(和大多数压缩格式)使用secuential压缩,你总是需要所有的,你需要的那些前位进行解码。结果 2:我提出的解决方案需要与每一个需要支持的格式进行。结果 3.-有很多开源的JPEG解码器,你可以修改的。 JPEG解码器需要解码该转换成8×8大小的像素块的比特(可变大小的)块。你可以做的是修改代码在内存中只保存你所需要的块,(因为它们被解码尽快基本上)只要它们不需要任何更多的放弃所有其他人。有了这些记忆保存的块,创建你需要的图片。点击 4.-由于Jpeg格式可与8×8块,你的工作可以,如果你用的8个像素大小的倍数的补丁工作更容易些。结果 5.-做JPEG解码器的修改可以用来替换如果保存补丁,并尽快丢弃块作为完成他们你正在做图像的预处理。这将是非常快和更少的内存消耗。

我知道这需要大量的工作,有很多的细节考虑(特别是如果你有彩色图像工作)进行拍摄,但如果你需要表现我相信你会一直战斗到底还是玩(因为你想看到它)与字节。

希望它能帮助。

其他提示

我不是100%肯定你以后但如果你正在寻找一种方式从string imagePath, Rectangle desiredPortion去一个System.Drawing.Image对象,那么也许是这样的:

public System.Drawing.Image LoadImagePiece(string imagePath, Rectangle desiredPortion)
{
   using (Image img = Image.FromFile(path))
   {
       Bitmap result = new Bitmap(desiredPortion.Width, desiredPortion.Height, PixelFormat.Format24bppRgb);
       using (Graphics g = Graphics.FromImage((Image)result))
       {
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.DrawImage(img, 0, 0, desiredPortion, GraphicsUnit.Pixel);
       }
       return result;
   }
}

请注意,对于性能方面的原因,你可能要考虑在构建多个输出图像一次,而不是调用此多次 - 也许它传递的矩形阵列和获取图像或相似的阵列

如果这不是你后你能澄清你实际上在寻找什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top