我们有一个应用程序,它显示来自本地网络资源的大图像文件(卫星图像)。 为了加快图像渲染速度,我们将图像划分为较小的贴片(例如6x6 cm),应用程序将它们适当地平铺。 但每次更新卫星图像时,都应该进行分割预处理,这是一项耗时的工作。
我想知道如何从原始文件中加载补丁?
PS 1:我找到LeadTools library,但我们需要一个开源解决方案。
PS 2:该应用程序在.NET C#
中编辑1: 格式对我们来说不是一个重点,但目前它是JPG。 可以考虑将格式更改为另一种格式,但BMP格式难以接受,因为它的体积很大。
答案 0 :(得分:1)
我不是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;
}
}
请注意,出于性能原因,您可能需要考虑一次构建多个输出图像,而不是多次调用它 - 可能会传递一个矩形数组并返回一组图像或类似图像。
如果那不是你想要的,你能澄清一下你真正想要的东西吗?
答案 1 :(得分:1)
我尝试回答你的问题,但我的浏览器吃了它...... :(
基本上我试图说的是:
1.-由于Jpeg(和大多数压缩格式)使用了一个secuential压缩,你总是需要解码所需的所有位。
2.-我建议的解决方案需要用你需要支持的每种格式来完成
3.-你可以修改很多开源的jpeg解码器。 Jpeg解码器需要解码转换为大小为8x8的像素块的比特块(可变大小)。您可以做的是修改代码以仅在内存中保存您需要的块,并在不再需要时立即丢弃所有其他块(基本上只要它们被解码)。使用这些存储器保存的块,创建所需的图像
4.-由于Jpeg使用8x8的块,如果使用大小为8像素的大小的补丁,您的工作会更容易。
5.-对jpeg解码器进行的修改可用于替换正在执行的图像的预处理,如果您保存修补程序并在完成后立即丢弃块。它会非常快,占用的内存也少。
我知道它需要做很多工作,并且需要考虑很多细节(特别是如果你使用彩色图像),但是如果你需要表现我相信你会永远结束战斗或玩(当你希望看到它与字节。
希望它有所帮助。