BitmapSource
。该图像的大小为14043像素x9933像素,是黑白(1bpp)图像。但由于以下代码约占用800 MB RAM,因此我遇到了
OutOfMemoryException
错误。以下代码生成我的特定文件尺寸的
ImageSource
.我这样做是为了看看是否可以在不使用磁盘上的实际文件的情况下使其正常工作。
public System.Windows.Media.ImageSource getImageSource(){
int width = 14043;
int height = 9933;
List<System.Windows.Media.Color> colors = new List<System.Windows.Media.Color>();
colors.Add(System.Windows.Media.Colors.Black);
colors.Add(System.Windows.Media.Colors.White);
BitmapPalette palette = new BitmapPalette(colors);
System.Windows.Media.PixelFormat pf = System.Windows.Media.PixelFormats.Indexed1;
int stride = width / pf.BitsPerPixel;
byte[] pixels = new byte[height * stride];
for (int i = 0; i < height * stride; ++i)
{
if (i < height * stride / 2)
{
pixels[i] = 0x00;
}
else
{
pixels[i] = 0xff;
}
}
BitmapSource image = BitmapSource.Create(
width,
height,
96,
96,
pf,
palette,
pixels,
stride);
return image;
}
在我的计算中,该图像应占用约16.7 MB。
此外,在使用BitmapSource.create时,我无法指定缓存选项。但是必须在加载时缓存图像。
此方法的返回值设置为图像控件的源。
问题重新打开
@Clemens发布答案后,一开始它确实有效。但是当我检查我的任务管理器时,发现了非常糟糕的行为。这是我正在使用的代码,它与@Clemens的答案完全相同。
public ImageSource getImageSource(){
var width = 14043;
var height = 9933;
var stride = (width + 7) / 8;
var pixels = new byte[height * stride];
for (int i = 0; i < height * stride; i++){
pixels[i] = 0xAA;
}
WriteableBitmap bitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.BlackWhite, null);
bitmap.WritePixels(new Int32Rect(0, 0, width, height), pixels, stride, 0);
bitmap.Freeze();
return bitmap;
}
在运行任何代码之前,我的任务管理器显示如下信息:(剩余1057 MB空间)
![enter image description here](https://istack.dev59.com/bvKGk.webp)
![Clemens Solution](https://istack.dev59.com/jpDET.webp)
private WriteableBitmap _writeableBitmap; //Added for storing the bitmap (keep it in scope)
public ImageSource getImageSource(){
var width = 14043;
var height = 9933;
var stride = (width + 7) / 8;
var pixels = new byte[height * stride];
for (int i = 0; i < height * stride; i++){
pixels[i] = 0xAA;
}
_writeableBitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.BlackWhite, null);
_writeableBitmap.WritePixels(new Int32Rect(0, 0, width, height), pixels, stride, 0);
_writeableBitmap.Freeze();
return null; //Return null (Image control source will be set to null now but bitmap still stored in private field)
}
我希望将位图保留在内存中,但不影响图像控件,这是结果:(剩余997 MB) (如您所见,蓝色线条在右侧仅略微增加)
![Clemens Solution Modified](https://istack.dev59.com/UcEvR.webp)
<Window x:Class="TifFileViewer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TifFileViewer"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
Title="MainWindow" Height="563" Width="1046">
<Grid Margin="10">
<Image x:Name="imageControl"/>
</Grid>
</Window>