WPF技巧-Canvas转为位图

本文介绍如何在WPF中将Canvas控件及其内容转换为位图文件,并提供了详细的步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签:

canvas

图片

杂谈

分类: wpf

WPF技巧-Canvas转为位图

原址:http://www.cnblogs.com/tmywu/archive/2010/09/14/1825650.html

      在WPF中我们可以将Canvas当成一种画布,将Canvas中的控件当成元素,讲其转成位图文件:

如下效果

 

                        

                                                         图1.1

       你可以设置Canvas的宽度、高度和颜色类型,生成任何你想要的图片。实时呈现你设置的样式等效果。

       包括创建一些特效如阴影等。

 

   WPF提供RenderTargetBitmap类将任何容器控件渲染成一个位图。

 

        新建一个WPF项目,在页面中创建一个CANVAS,如下:      

1              < Canvas x:Name = " Screen "  Width = " 700 "  Height = " 200 "  Background = " #F0CC0000 " >            
2                   < TextBlock Canvas.Left = " 200 "  Canvas.Top = " 50 "  x:Name = " VSSize "  text = " Canvs 转换为图片 " ></ TextBlock >                
3              </ Canvas >

 

        在CS代码中做处理:

复制代码
 1  RenderTargetBitmap bmp  =   new  RenderTargetBitmap( this .Screen.Width,  this .Screen.Height,  96 96 PixelFormats.Pbgra32);    
 2  bmp.Render( this .Screen);     
 3  string  file  =   @" c:\xxx.jpg "     
 4  string  Extension  =  System.IO.Path.GetExtension(file).ToLower();     
 5  BitmapEncoder encoder  =   new  JpegBitmapEncoder();             
 6  encoder.Frames.Add(BitmapFrame.Create(bmp));     
 7  using  (Stream stm  =  File.Create(file))    
 8         
 9  encoder.Save(stm);    
10             
复制代码

 

         这样就将CANVAS转换成图1.1的效果;

         如果你对生成的图片有更高的清晰度的要求,你可以设置encoder的QualityLevel属性来改变JPEG的质量值,或者生成质量更高的PNG图片,如 

 

1  encoder  =   new  PngBitmapEncoder();            

 

 

         我们改变下CANVAS的一些属性,将一个名为SCREEN的CANVAS 放在另一个CANVAS中并设置上偏移50,设置如下: 

 

【转】WPF技巧-Canvas转为位图 代码
< Canvas >
 
< Canvas Canvas.Top = " 50 "  x:Name = " Screen "  Width = " 700 "  Height = " 200 "  Background = " #F0CC0000 " >            
      
< TextBlock Canvas.Left = " 200 "  Canvas.Top = " 50 "  x:Name = " VSSize "  text = " Canvs 转换为图片 " ></ TextBlock >                
 
</ Canvas >
</ Canvas >

 

           后台CS代码不变;

           效果如下:

         图片上出现一条黑块,将此图片放入PHOTOSHOP中可看见居上偏移50为一透明块,证明任何属性的偏移对CANVAS的构图都会造成影响。

 

         那么直接在后台CS文件中建一个CANVAS直接生成位图是否可以?如下:

复制代码
 1  Canvas cvs  =   new  Canvas();
 2  cvs.Width  =   700 ;
 3  cvs.Height  =   200 ;
 4  Label lb  =   new  Label();
 5  lb.content  =   " Canvas 转换为 图片 " ;
 6  Canvas.SetTop(lb, 50 );
 7  Canvas.Setleft(lb, 200 );
 8  cvs.child.add(lb);
 9  RenderTargetBitmap bmp  =   new  RenderTargetBitmap(cvs.Width, cvs.Height,  96 96 PixelFormats.Pbgra32);    
10  bmp.Render(cvs);     
11  string  file  =   @" c:\xxx.jpg "     
12  string  Extension  =  System.IO.Path.GetExtension(file).ToLower();     
13  BitmapEncoder encoder  =   new  JpegBitmapEncoder();             
14  encoder.Frames.Add(BitmapFrame.Create(bmp));     
15  using  (Stream stm  =  File.Create(file))    
16         
17  encoder.Save(stm);    
18  }
复制代码

 

            运行代码,保存成的图像为一张700*200的空位图,说明直接在后台构造的容器无法直接转为位图。

            解决办法:

           RenderTargetBitmap.Render的对象为一个Visual对象,界面元素都继承自Visual对象。

           我们可以建一个虚拟画布对象,如DrawingVisual drawingVisual = new DrawingVisual();

           以此为基础使用DrawingContext对象将Canvas及其Child中的对象在DrawingVisual 虚画布上重新进行构图,然后Render DrawingVisual 就可以生成一张位图了。

           示例:

          

 

【转】WPF技巧-Canvas转为位图 代码
复制代码
Canvas cvs  =   new  Canvas();
cvs.Width 
=   700 ;
cvs.Height 
=   200 ;
Label lb 
=   new  Label();
lb.content 
=   " Canvas 转换为 图片 " ;
Canvas.SetTop(lb,
50 );
Canvas.Setleft(lb,
200 );
cvs.child.add(lb);

DrawingVisual drawingVisual 
=   new  DrawingVisual();
DrawingContext drawingContext 
=  drawingVisual.RenderOpen();

// 构造一个矩形
Rect rect  =   new  Rect( new  System.Windows.Point( 0 0 ),  new  System.Windows.Point(cvs.ActualWidth, cvs.ActualHeight));
// 画一个矩形
drawingContext.DrawRectangle(cvs.Background,  new  System.Windows.Media.Pen(), rect);
// 画文字
drawingContext.DrawText( new  FormattedText(),  new  System.Windows.Point(Canvas.GetLeft(lb), Canvas.GetTop(lb)));

drawingContext.Close();

RenderTargetBitmap bmp 
=   new  RenderTargetBitmap(cvs.Width, cvs.Height,  96 96 PixelFormats.Pbgra32);    
// Render DrawingVisual 
bmp.Render(drawingVisual);     
string  file  =   @" c:\xxx.jpg "     
string  Extension  =  System.IO.Path.GetExtension(file).ToLower();     
BitmapEncoder encoder 
=   new  JpegBitmapEncoder();             
encoder.Frames.Add(BitmapFrame.Create(bmp));     
using  (Stream stm  =  File.Create(file))    
       
encoder.Save(stm);    
}
复制代码
### WPF BMP 图像设置透明度方法 在 Windows Presentation Foundation (WPF) 中处理 BMP 图像并为其设置透明度,可以采用多种方式实现。一种常见的方式是通过调整 `Opacity` 属性来控制整个图像的不透明程度。 对于需要更精细地控制单个像素级别的透明效果,则涉及到图像格式的支持问题。由于标准的 BMP 文件并不直接支持 alpha 通道(即透明信息),因此如果要让 BMP 图片具有部分区域透明的效果,在加载该图片到应用程序之前可能需要将其转换成支持透明度的颜色模式[^2]。 当使用 Image 控件展示经过处理后的位图资源时,可以通过如下 XAML 示例代码片段完成基础配置: ```xml <Image Source="your_converted_image.png" Opacity="0.5"/> ``` 此处假设已经把原始 BMP 转换成 PNG 或其他带有 Alpha 通道的新文件,并指定了适当的路径作为 `Source` 的值;而 `Opacity` 设置了一个介于 0 到 1 之间的浮点数表示整体透明度水平——其中 0 表示完全不可见,1 表示全不透明[^1]。 另外,也可以利用 BitmapSource 类及其子类如 FormatConvertedBitmap 来动态创建带透明度的信息,这允许程序运行期间修改图像特性而不依赖外部素材文件。下面是一个简单的 C# 实现例子,展示了如何基于现有位图对象构建一个新的包含透明度版本的对象: ```csharp var bitmap = new BitmapImage(new Uri("path_to_bmp_file.bmp", UriKind.RelativeOrAbsolute)); FormatConvertedBitmap formatConvertedBitmap = new(); formatConvertedBitmap.BeginInit(); formatConvertedBitmap.Source = bitmap; // 将颜色空间转为支持Alpha通道的形式, 如Pbgra32 formatConvertedBitmap.DestinationFormat = PixelFormats.Pbgra32; formatConvertedBitmap.EndInit(); imageControl.Source = formatConvertedBitmap; ``` 上述操作会尝试改变原位图的颜色编码方案以便能够表达每像素四个分量中的一个代表透明级别。需要注意的是这种做法仅适用于内存内的图像实例化过程,不会影响磁盘上的实际存储形式[^3]。 最后值得注意的一点是在某些场景下为了获得更好的性能表现或是特定视觉特效,还可以考虑结合 Canvas 容器或者其他绘图服务来进行更为复杂的图形变换与合成工作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值