我猜你正在做的事情liek这样的:
Bitmap bitmap = new Bitmap (filename of jpeg);
,然后做:
OnPaint (...)
{
Graphics g = ....;
g.DrawImage (bitmap, ...);
}
这将是调整的巨大JPEG图像上每一次屏幕上显示的尺寸你画它。我猜你的JPEG大小约为2500x2000像素。当您将JPEG加载到位图中时,位图加载代码解压缩数据并将其存储为可容易呈现的格式(即以与显示器相同的像素格式)的RGB数据或作为被称为设备独立位图(又名DIBitmap)。这些位图需要比压缩的JPEG存储更多的RAM。
你目前的实现已经在做格式转换和调整大小,但是以一种不合理的方式进行,即每次渲染时调整一个巨大的图像到屏幕大小。
理想情况下,您想要加载图像并将其缩小。 .Net有一个系统来执行此操作:
Bitmap bitmap = new Bitmap (filename of JPEG);
Bitmap thumbnail = bitmap.GetThumbnailImage (width, height, ....);
bitmap.Dispose(); // this releases all the unmanged resources and makes the bitmap unusable - you may have been missing this step
bitmap = null; // let the GC know the object is no longer needed
其中宽度和高度是所需缩略图的大小。现在,这可能会产生看起来不够好的图像(但它会使用任何嵌入的缩略图数据(如果存在的话会更快),在这种情况下,请执行位图 - >位图调整大小。
当您创建PDF文件时,您需要重新加载JPEG数据,但从用户的角度来看,没关系。我相信,只要您有一些反馈意见让用户知道正在处理数据,用户不会介意等一会儿将数据导出为PDF。您也可以在后台线程中执行此操作,并让用户在另一个拼贴画上工作。
所以......你需要一个有效的解决方案,但是你不想使用提高效率的方法,即在较低的层次上处理图像?为什么不?我不知道Silverlight,希望你找到一个解决方案,但有时你实际上不得不卷起袖子做一些工作。 – 2010-03-15 23:58:53
问题只在于内存效率。我不需要快速渲染或快速修改图像数据本身 - 我只需要使用不超过内存中的实际JPEG数据来表示它,并在稍后将它合并到PDF中。我使用的PDF框架需要我输入JPEG数据流,但我没有看到将BitmapImage转换为JPEG流的好方法。 – 2010-03-16 00:14:43
您可以包含一些关于程序如何工作的代码,以及图像的一般大小是什么?您一次显示多少个? – 2010-04-06 14:31:08