使用WPF将图片转变为灰度并加上水印并保存为文件
运行效果:
(上图中左下角为原图的缩小显示,By:Johnson为TextBlock)
保存的结果图片:
上图的“Test Words.”为水印文字。
XAML代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AboutColor.FormatConvertedBitmapIndex1"
x:Name="Window"
Title="FormatConvertedBitmap"
Width="640" Height="480">
<Grid x:Name="LayoutRoot">
<Button Height="23" HorizontalAlignment="Right" Margin="0,5,12,0" Name="button1" VerticalAlignment="Top" Width="119" Click="FormatConvertedIndex1Bitmap">ConvertToIndex1</Button>
<Image Margin="7,35,8,7" Name="destImage" />
<Image Margin="10,0,0,9.33299999999997" Source="ZhangLala.jpg" Stretch="Fill" Height="151.667" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="205" />
<TextBlock Margin="229,0,277,42" x:Name="txtBlock_Watermark" VerticalAlignment="Bottom" Height="Auto" FontFamily="Bauhaus 93" FontSize="22" Text="By: Johnson" TextWrapping="Wrap"/>
</Grid>
</Window>
C#代码: (为了方便解释,直接将注释放在代码中)
void FormatConvertedIndex1Bitmap(object sender, RoutedEventArgs e)
{
BitmapImage myBitmapImage = new BitmapImage();
// 象BitmapImage的BitmapSource对象,仅在BeginInit/EndInit区块中可以改变它们的属性(区块之外的,不起作用)。
myBitmapImage.BeginInit();
myBitmapImage.UriSource = new Uri(@"ZhangLala.jpg", UriKind.RelativeOrAbsolute);
//为了取得更好的性能(比如节省内存及节约处理时间),设置DecodePixelWidth或/和DecodePixelHeight来指定图片的渲染宽度或/和高度。如果不设定此置,则按正常原尺寸做处理。当你的原始图片特别大时,特别建议你设定图片的这两个属性之一或都设置。当只设定其中之一时,将会根据图片的原始宽高,自动变换另一边的大小,这样图片就不会变形失真。
//当你两个属性值都设定时,将分别渲染图片至指定的宽度/高度。
myBitmapImage.DecodePixelWidth = 500;
myBitmapImage.EndInit();
// 转换BitmapSource为新格式
// 注:新的BitmapSource不被缓存。它将在需要时才加载。
FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
// 同样,象FormatConvertedBitmap的BitmapSource对象,仅在BeginInit/EndInit区块中可以改变它们的属性(区块之外的,不起作用)。
newFormatedBitmapSource.BeginInit();
// 使用已定义的myBitmapImage作为newFormatedBitmapSource的“源”
newFormatedBitmapSource.Source = myBitmapImage;
// 将新图的DestinationFormat属性设置为Gray2图像格式。
newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray16;
// 将新图的DestinationFormat属性设置为Indexed1图像格式。
//newFormatedBitmapSource.DestinationFormat = PixelFormats.Indexed1;
// 由于目标格式要被处理成索引像素格式(Indexed1),因此需要设置目标调色板。
// 下面使用红色和蓝色做为目标调色板
List<System.Windows.Media.Color> colors = new List<System.Windows.Media.Color>();
colors.Add(System.Windows.Media.Colors.White);
colors.Add(System.Windows.Media.Colors.DarkGoldenrod);
BitmapPalette myPalette = new BitmapPalette(colors);
// 将上面自定义的调色板设置为新图的DestinationPalette属性
newFormatedBitmapSource.DestinationPalette = myPalette;
newFormatedBitmapSource.EndInit();
// 建立Image元素,并将新图作为“源”
destImage.BeginInit();
destImage.Source = newFormatedBitmapSource;
destImage.EndInit();
string fileName = @"c:/ConvertImageToGray16.jpg";
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
int width = 500;
int height = 400;
Rect rectangle = new Rect(0, 0, width, height);
drawingContext.DrawImage(newFormatedBitmapSource, rectangle);
// 画文字
FormattedText ft = new FormattedText("Test Words.",
System.Globalization.CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Verdana"),
36, Brushes.Black);
drawingContext.DrawText(ft, new Point(20, 200));
//在这里你还可以加图片水印等......
//drawingContext.DrawImage(yourImageSource, imageRectangle);
drawingContext.Close();
// 利用RenderTargetBitmap对象,以保存图片
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
renderBitmap.Render(drawingVisual);
// 利用JpegBitmapEncoder,对图像进行编码,以便进行保存
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 80; // 设置JPEG的质量值
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
// 保存文件
FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
encoder.Save(fileStream);
// 关闭文件流
fileStream.Close();
}
使用WPF将图片转变为灰度并加上水印并保存为文件的更多相关文章
- WPF 将图片进行灰度处理
原文:WPF 将图片进行灰度处理 处理前: 处理后: 这个功能使用使用了 FormatConvertedBitmap(为BitmapSource提供像素格式转换功能) 代码如下: ...
- Halcon WPF C#采集图像区域灰度值
源码下载地址:https://github.com/lizhiqiang0204/ImageGray.git Halcon代码如下: *读取图片,转换成灰度图片 read_image (Image1, ...
- C# WPF 显示图片和视频显示 EmuguCv、AForge.Net测试(续)
介绍 本文是接着上文<C# WPF 显示图片和视频显示 EmuguCv.AForge.Net测试>写的,建议先看下上文,因为有些代码还需要了解. 增添 接着上文的代码,我们可以在事件处理方 ...
- WPF 中图片的加载 ,使用统一资源标识符 (URI)
在wpf中,设置图片路径有2种方法: 1.xaml文件中,指定路径 <Button Name=" HorizontalAlignment="Right" Verti ...
- WPF显示图片
1.WPF显示图片内部一部分 <Rectangle Height="> <Rectangle.Fill > <ImageBrush ImageSource=&q ...
- Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决
关于Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决, 可想,一个固定的字符串MS都能找到,按常理动态绑定也应该没问题的,只需在前面标记它是一个Path类型的值它就能 ...
- OprenCV学习之路一:将彩色图片转换成灰度图
//将一张彩色图片转成灰度图: //////////////////////////// #include<cv.h> #include<cvaux.h> #include&l ...
- WPF 修改图片颜色
原文:WPF 修改图片颜色 本文告诉大家如何修改图片的颜色,如去掉图片的蓝色 在 WPF 可以使用很多图片处理的方法,本文告诉大家的是一个图片处理,可以把处理的图片保存在文件. 在阅读本文,我假设大家 ...
- WPF 把图片分割成两份自动翻页 WpfFlipPageControl:CtrlBook 书控件
原文:WPF 把图片分割成两份自动翻页 WpfFlipPageControl:CtrlBook 书控件 版权声明:本文为博主原创文章,需要转载尽管转载. https://blog.csdn.net/z ...
随机推荐
- js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用)
js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用) 一.总结 2.匿名函数作为参数传递 二.js进阶ajax函数封装 ajax1.js function ajax(ur ...
- php实现数值的整数次方
php实现数值的整数次方 一.总结 没有考虑到指数为负数的情况 二.php实现数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exp ...
- 一个Exception catch不住的【异常】
现象: Controller中的方法接收到前台ajax请求后开始执行, 当执行到某一行时程序终止,前台回调进Error方法. 后台明明catch了Exception异常,但异常并没有被捕获(不进cat ...
- [Ramda] Handle Branching Logic with Ramda's Conditional Functions
When you want to build your logic with small, composable functions you need a functional way to hand ...
- 在Eclipse中运行hadoop程序 分类: A1_HADOOP 2014-12-14 11:11 624人阅读 评论(0) 收藏
1.下载hadoop-eclipse-plugin-1.2.1.jar,并将之复制到eclipse/plugins下. 2.打开map-reduce视图 在eclipse中,打开window--> ...
- 修改QList中的item(使用下标([index])才可以获得可修改的item的引用)
QList算是最常用的集合了,今儿偶然间需要修改QList中的值,结果郁闷了.QList中提供了replace函数来替换item,但不是修改.而at().value()操作均返回的是const的ite ...
- 检测dll是32/64位?(直接读dll文件包含的某几个字节进行判断)
检查dll是32位还是64位? #include "stdafx.h" #include <Windows.h> int _tmain(int argc, _TCHAR ...
- Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...
- 【t058】拜年
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 拜年是中国人少不了的风俗.还没过年呢,刚上小学的妮妮已经等不及要给她的小伙伴去拜年了,但是她不知道如何 ...
- JS类型转换规则详解
JS类型转换规则详解 一.总结 一句话总结:JS强制类型转换中的类型名强制类型转换和其它语言不同,是类型类的构造方法,Number(mix) 一句话总结(JS类型本质):因为js是弱类型语言,所以它相 ...