C# 在使用StorageFile读取图像之前,是否使用它获取位图尺寸?
好的,我正在尝试在WPF应用程序中分析图像的启发式。当用户选择图像文件位置时,我想在codebehind中打开图像,检查图像的颜色,并在应用程序中输出它们。但是,为了正确检查图像的像素,我需要获取尺寸,以便将其加载到一个C# 在使用StorageFile读取图像之前,是否使用它获取位图尺寸?,c#,mvvm,bitmapimage,win-universal-app,writeablebitmap,C#,Mvvm,Bitmapimage,Win Universal App,Writeablebitmap,好的,我正在尝试在WPF应用程序中分析图像的启发式。当用户选择图像文件位置时,我想在codebehind中打开图像,检查图像的颜色,并在应用程序中输出它们。但是,为了正确检查图像的像素,我需要获取尺寸,以便将其加载到一个可写位图,该贴图可以获取像素颜色 当我第二次打开文件流时,应用程序就挂起了。代码如下: private static async Task<Dictionary<Color, int>> GetColorCountsAsync(string pat
可写位图
,该贴图可以获取像素颜色
当我第二次打开文件流时,应用程序就挂起了。代码如下:
private static async Task<Dictionary<Color, int>> GetColorCountsAsync(string path)
{
var colorCounts = new Dictionary<Color, int>();
var absolutePath = string.Format(@"{0}\{1}",Directory.GetCurrentDirectory(),path);
var dimension = await GetBitmapDimensions(absolutePath); //Method below - opens via StorageFile
var file = await StorageFile.GetFileFromPathAsync(absolutePath); //Hangs forever
using (var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false))
{
var pixelWidth = dimension.Width;
var pixelHeight = dimension.Height;
var bitmap = new WriteableBitmap(pixelWidth, pixelHeight);
bitmap.SetSource(stream.AsRandomAccessStream());
using (var buffer = bitmap.PixelBuffer.AsStream())
{
var pixels = new byte[4 * pixelWidth * pixelHeight];
buffer.Read(pixels, 0, pixels.Length);
for (var y = 0; y < pixelHeight; y++)
{
for (var x = 0; x < pixelWidth; x++)
{
var index = ((y * pixelWidth) + x) * 4;
var alpha = pixels[index + 4];
var red = pixels[index + 2];
var green = pixels[index + 1];
var blue = pixels[index + 0];
var color = Color.FromArgb(alpha, red, green, blue);
if (!colorCounts.ContainsKey(color))
{
colorCounts.Add(color, 0);
}
colorCounts[color] = colorCounts[color] + 1;
}
}
}
}
return colorCounts;
}
private static async Task<Dimension> GetBitmapDimensions(string absolutePath)
{
var file = await StorageFile.GetFileFromPathAsync(absolutePath);
var bitmapImage = new BitmapImage();
using (var fileStream = await file.OpenAsync(FileAccessMode.Read))
{
bitmapImage.SetSource(fileStream);
}
return new Dimension { Height = bitmapImage.PixelHeight, Width = bitmapImage.PixelWidth };
}
私有静态异步任务GetColorCountsAsync(字符串路径)
{
var colorCounts=新字典();
var absolutePath=string.Format(@“{0}\{1}”,Directory.GetCurrentDirectory(),path);
var dimension=await GetBitmapDimensions(absolutePath);//下面的方法-通过StorageFile打开
var file=wait-StorageFile.GetFileFromPathAsync(绝对路径);//永远挂起
使用(var stream=await file.OpenStreamForReadAsync().ConfigureAwait(false))
{
var pixelWidth=维度宽度;
var pixelHeight=维度高度;
var位图=新的可写位图(像素宽度、像素高度);
SetSource(stream.AsRandomAccessStream());
使用(var buffer=bitmap.PixelBuffer.AsStream())
{
var pixels=新字节[4*像素宽度*像素高度];
读取(像素,0,像素,长度);
对于(变量y=0;y
我无法关闭位图图像,也无法处理它-是什么导致应用程序冻结?您不需要正确尺寸的位图,因为
SetStream()
是一种扩展方法。它首先需要一个对象,按如下方式调用它:
var bitmap = new WriteableBitmap(1,1).SetSource(stream.AsRandomAccessStream());
您不需要正确尺寸的位图,因为
SetStream()
是一种扩展方法。它首先需要一个对象,按如下方式调用它:
var bitmap = new WriteableBitmap(1,1).SetSource(stream.AsRandomAccessStream());