C# 如何在没有内存问题的情况下加载/操作大型图像?

C# 如何在没有内存问题的情况下加载/操作大型图像?,c#,asp.net,c#-4.0,C#,Asp.net,C# 4.0,试图将大型图像(例如9000x9000像素的图像)加载到位图对象中可能会产生内存不足错误、错误以及毫无疑问的其他相关问题 如何从磁盘加载9000x9000像素的图像,并在保存回磁盘之前最终调整其大小,而不会导致致命错误(如内存不足) 让我们假设一个32位的环境,内存为2gb,C#4.0,将使用jpg、gif、bmp、tif、png等图像格式 我尝试了以下3个片段,每个片段都因内存错误而失败 尝试1: using (Bitmap srcImg = new Bitmap(@"C:\9000

试图将大型图像(例如9000x9000像素的图像)加载到位图对象中可能会产生内存不足错误、错误以及毫无疑问的其他相关问题

如何从磁盘加载9000x9000像素的图像,并在保存回磁盘之前最终调整其大小,而不会导致致命错误(如内存不足)

让我们假设一个32位的环境,内存为2gb,C#4.0,将使用jpg、gif、bmp、tif、png等图像格式

我尝试了以下3个片段,每个片段都因内存错误而失败

尝试1:

using (Bitmap srcImg = new Bitmap(@"C:\9000x9000.jpg"))
{
    // boom
}
尝试2:

using (Image srcImg = Image.FromFile(@"C:\9000x9000.jpg"))
{
    // kapow
}
尝试3:

using (FileStream fs = new FileStream(@"C:\9000x9000.jpg", FileMode.Open, FileAccess.Read))
{
    using (Image srcImg = Image.FromStream(fs))
    {
        // kelly clarkson
    }
}
我认为一种可能的解决方案是将图像文件直接加载到数组中(这样就不会有位图对象的巨大开销),使用该数组以某种方式将其调整为较小的大小(可能需要为不同的图像格式头编码?),然后最终转换为可管理大小的位图对象


想法或可能的解决方案?

请查看,它用于处理大型文件。

以下是我为使其正常工作而遵循的步骤:

1.转到下载SDF 2.0 Beta1可再发行版本。安装

2.在VS.NET 2005中创建一个针对PPC 2003 SE设备的智能设备项目。我必须右键单击我的项目并选择“升级”,以确保它针对的是.NET CF v2.0而不是.NET CF 1.1 SP3

3.我添加了OpenNETCF.dll和OpenNETCF.Drawing.dll文件作为默认安装目录(C:\Program files\OpenNETCF\Smart Device Framework 2.0)中的引用

4.我创建了一个简单的应用程序,在表单上有一个picturebox,在加载表单时加载我的图像。以下是相关代码,其中一些是从Alex Feinman的web日志中复制的:

#region Using directives
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using OpenNETCF.Drawing.Imaging;
using System.IO;
#endregion

....

const string szFileName = @"\Storage Card\TEMP\2MBJPEG.JPG";



private void Form1_Load(object sender, EventArgs e)
{
IBitmapImage imageBitmap;
FileStream fsImage;
fsImage = new FileStream(
    szFileName,
    FileMode.Open);
imageBitmap = CreateThumbnail(
    fsImage,
    new Size(100, 100));

Bitmap bm = ImageUtils.IBitmapImageToBitmap(
    imageBitmap);
pictureBox1.Image = bm;
}


static public IBitmapImage CreateThumbnail(Stream stream, Size size)
{
IBitmapImage imageBitmap;
ImageInfo ii;
IImage image;
ImagingFactory factory = new ImagingFactoryClass();
    factory.CreateImageFromStream(
    new StreamOnFile(stream), 
    out image);
image.GetImageInfo(out ii);
factory.CreateBitmapFromImage(
    image, 
    (uint)size.Width, 
    (uint)size.Height,
    ii.PixelFormat, 
    InterpolationHint.InterpolationHintDefault, 
    out imageBitmap);
    return imageBitmap;
}

错误消息是什么?首先在一个简单的控制台应用程序中尝试,然后在应用程序中应用解决方案。图像的位深度是多少?我很好奇这个图像要消耗多少内存。我猜是很多,因为32位图像至少意味着310MB。考虑到您的另一个问题,我强烈建议您升级到至少具有8GB ram的64位系统。。可能更多。我建议你使用专门为处理如此大的图像而设计的工具你真的会出错吗,或者你只是在猜测可能出现的问题?我看不出有任何先验的理由认为一张18mpx的图片会引起任何悲伤,除非你真的想把它放大。它将占用几百MB的空间。@Marcelocontos他说他实际上在问题中尝试过,并提到内存不足和“参数无效”(=ArgumentException)来回答:确切的错误是,具体取决于环境:“参数无效。at System.Drawing.Bitmap..ctor”(问题中的链接提供了有关错误的信息)和“OutOfMemoryException:内存不足。在System.Drawing.Bitmap..ctor.Bitmap对象中,位图对象为“32位”(PixelFormat.Format32bppArgb)允许alpha透明,例如png。升级到64位系统/8gb ram是未来可能的选择,但请记住,问题是指定32位/2gb;此外,优化代码以在32位/2gb环境下工作无疑也会使其在64位/8gb环境下更高效。我感觉他的系统正在构建中ned非常糟糕,使用像这样的库可能是一个很好的选择,最大的限制是32位系统。在32位系统上,单个对象的大小非常有限,位图对象的开销很大,因此在32位系统上出现内存不足错误并不需要太多,即使系统实际上可能有空闲内存。在任何情况下,优化代码以尽可能少地占用内存都是很好的,即使是在64位环境中也是如此。关于一个RGE的初步想法:它似乎最初直接将图像加载到位图对象中,因此它会有完全相同的内存问题(注释末尾的链接显示一个RGE FromFile方法)。我将运行一些测试来验证。你是说这可以让你在32位系统上处理巨大的图像吗?