You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF C#中Canvas加载图片后如何设置640×480分辨率?DecodePixel属性失效

WPF Canvas中BitmapImage的DecodePixelHeight/DecodePixelWidth不生效的解决办法

嘿,我一眼就发现问题所在了!你设置的DecodePixelHeight和DecodePixelWidth没生效,主要是两个关键错误导致的:

问题根源

  1. Uri类型错误:你用了UriKind.Relative,但实际传入的是绝对路径,BitmapImage会找不到图片,后续的解码设置自然无效。
  2. 没有正确初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:29:23