WPF C#中Canvas加载图片后如何设置640×480分辨率?DecodePixel属性失效
WPF Canvas中BitmapImage的DecodePixelHeight/DecodePixelWidth不生效的解决办法
嘿,我一眼就发现问题所在了!你设置的DecodePixelHeight和DecodePixelWidth没生效,主要是两个关键错误导致的:
问题根源
- Uri类型错误:你用了
UriKind.Relative,但实际传入的是绝对路径,BitmapImage会找不到图片,后续的解码设置自然无效。 - 没有正确初始化BitmapImage:直接通过Uri构造函数创建BitmapImage后,它会立即开始加载解析图片,这时候再设置解码参数已经晚了——必须用
BeginInit()和EndInit()来包裹属性设置,确保这些参数在图片加载前被应用。
修正后的完整代码
ImageBrush brush = new ImageBrush(); BitmapImage src = new BitmapImage(); // 进入初始化模式,确保所有属性设置在图片加载前生效 src.BeginInit(); // 使用绝对Uri匹配你的本地路径 src.UriSource = new Uri(@"C:\Users\i2v\Desktop\GoogleMapTA.jpg", UriKind.Absolute); // 设置解码尺寸 src.DecodePixelWidth = 640; src.DecodePixelHeight = 480; // 可选:如果需要强制按指定尺寸解码(忽略原图比例),取消下面注释 // src.DecodePixelType = DecodePixelType.Logical; // 结束初始化,开始加载图片并应用解码参数 src.EndInit(); brush.ImageSource = src; // 根据需求设置拉伸模式:比如Uniform保持比例,Fill填满,None不拉伸 brush.Stretch = Stretch.Uniform; canvas.Background = brush; // 现在src的Height/Width就是你设置的解码尺寸了 canvas.Height = src.Height; canvas.Width = src.Width;
关键细节说明
- BeginInit/EndInit的必要性:BitmapImage是Freezable对象,这两个方法会暂停图片加载逻辑,直到你调用
EndInit()才会真正读取图片并应用所有初始化参数——包括你设置的解码尺寸。 - Uri类型匹配:绝对路径必须用
UriKind.Absolute,否则BitmapImage会尝试从程序集的相对路径查找图片,必然失败。 - Stretch属性调整:如果原图的宽高比和640×480不一致,
Stretch.None只会显示图片的一部分,Stretch.Uniform会保持比例缩放至合适大小,Stretch.Fill则会拉伸填满Canvas,根据你的需求选择即可。
内容的提问来源于stack exchange,提问作者Aarushi Bhatia
相关产品推荐
相关产品推荐

