使用WPF将图片转变为灰度并加上水印并保存为文件

原文:使用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();
??????? }

原文地址:https://www.cnblogs.com/lonelyxmas/p/9849691.html

时间: 2024-10-08 23:56:11

使用WPF将图片转变为灰度并加上水印并保存为文件的相关文章

OprenCV学习之路一:将彩色图片转换成灰度图

//将一张彩色图片转成灰度图: //////////////////////////// #include<cv.h> #include<cvaux.h> #include<highgui.h> #include<ml.h> #include<iostream> using namespace std; using namespace cv; int main() { IplImage *src=0; src=cvLoadImage("

WPF显示图片

1.WPF显示图片内部一部分 <Rectangle Height="12" Width="60"> <Rectangle.Fill > <ImageBrush ImageSource="Pic\icon_tubiao1.png" ViewboxUnits="Absolute" Viewbox="448,407,60,12"></ImageBrush> <

WPF(C#)图片色彩的纠正-上

WPF(C#)图片色彩的纠正-上 WPF(C#)图片色彩的纠正-下 前言 对图片进行色彩的纠正,其实与WPF是没有什么关系的,为什么标题又是“WPF(C#)图片色彩的纠正”呢,因为这些图片色彩的纠正功能都是承载在WPF界面上的,并且我也很想介绍一些关于WPF方面的知识,所以就命名了此标题. 这个软件的主要功能是通过设置Tint, BlackEnhance, ColorVibrancy, Automatic, Sharpen, Depth,Bias等参数来对图片的色彩进行纠正(参数属于专业领域词汇

WPF 无缝图片滚动

上图是效果  可以双方向拖动 废话不多说上代码 界面: 1 <Window x:Class="FlashPrac2.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow&qu

Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决

关于Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决, 可想,一个固定的字符串MS都能找到,按常理动态绑定也应该没问题的,只需在前面标记它是一个Path类型的值它就能找到了. 具体问题: 1.固定的图片路径是可以的,如下: <Image Source="../Assets/icons/large/1389966549_Analytics_two.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的是一个Im

一起学android之给图片去色,返回灰度图片以及ColorMatrix中setSaturation方法的用法(34)

原图: 效果图: 实现以上效果其实很简单,直接上代码: public class MainActivity extends Activity { private Button btn_start; private ImageView img; private Bitmap bitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon

c# winform 把彩色图片转换为灰色的图片,变灰,灰度图片,速度很快,safe,unsafe

把彩色图片转换为灰色的图片,直接用.net接口遍历每个像素点转换的效率非常低,800K的图片65万像素我的电脑要用5分钟,而用了unsafe,速度提高了几千倍,同样的图片只用了0.几秒 附一个常用的遍历像素点转换的代码 构造函数 C#代码   public Tphc() { InitializeComponent(); this.pictureBox1.ImageLocation = "F:\\黑色头发.jpg"; } 按钮单击事件 C#代码   private void button

Xcode9学习笔记51 - 将一张普通的图片转换成灰度图片CGColorSpaceCreateDeviceGray

override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let image = UIImage(named: "img01")//从项目资源中读取一张图片 let grayedImage = self.grayImage(image: image!)//调用灰度图转换方法,将图片转换成灰度图 let

WPF 修改图片颜色

原文:WPF 修改图片颜色 本文告诉大家如何修改图片的颜色,如去掉图片的蓝色 在 WPF 可以使用很多图片处理的方法,本文告诉大家的是一个图片处理,可以把处理的图片保存在文件. 在阅读本文,我假设大家是熟悉 WPF 的,至少了解 C# ,也知道图片的格式. 在 WPF 可以使用 ARBG 数组表示图片,本文修改图片颜色的方法就是使用 ARBG 数组的方法修改,修改里面的元素的值. 如我需要去掉图片的蓝色,就可以通过修改 ARBG 数组的元素,设置所有蓝色为 0 ,去掉蓝色. 读取图片 首先找到一