0

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

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

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

PS 2:该应用程序使用 .NET C#

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

4

2 回答 2

1

我不是 100% 确定你在追求什么,但如果你正在寻找一种从对象string imagePath, Rectangle desiredPortionSystem.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;
   }
}

请注意,出于性能原因,您可能需要考虑一次构建多个输出图像,而不是多次调用它 - 可能将一个矩形数组传递给它并返回一个图像数组或类似数组。

如果这不是你所追求的,你能澄清你真正在寻找什么吗?

于 2009-12-08T07:10:30.793 回答
1

我对您的问题进行了一次漂亮的尝试,但是我的浏览器吃掉了它... :(

基本上我想说的是:

1.- 由于 Jpeg(和大多数压缩格式)使用连续压缩,因此您始终需要解码所需位之前的所有位。
2.- 我建议的解决方案需要使用您需要支持的每种格式来完成。
3.- 有很多开源 jpeg 解码器可以修改。Jpeg 解码器需要解码转换为大小为 8x8 的像素块的位块(大小可变)。您可以做的是修改代码以仅将您需要的块保存在内存中,并在不再需要它们时丢弃所有其他块(基本上在它们被解码后)。使用这些节省内存的块,创建您需要的图像。
4.- 由于 Jpeg 使用 8x8 的块,如果你使用大小为 8 像素倍数的补丁,你的工作会更容易。
5.- 如果您保存补丁并在完成后立即丢弃块,则对 jpeg 解码器所做的修改可用于替代您正在执行的图像的预处理。它会非常快并且内存消耗更少。

我知道它需要做很多工作,并且需要考虑很多细节(特别是如果您使用彩色图像),但是如果您需要表现,我相信您将永远结束战斗或玩耍(如您所见它)与字节。

希望能帮助到你。

于 2010-01-08T18:16:31.760 回答