你的位置:首页 > ASP.net教程

[ASP.net教程]WPF GDI+ bitmap.save 一般性错误


做水印图片的时候,发现WPF的System.Windows.Shapes类有绘制直线,椭圆等形状。却没有绘字符串的类。

无奈之下又用回GDI+

发生的GDI+一般性错误初步估计的线程的原因。

在load事件加载不会出一般性错误。由于业务的要求,这个是放在一个定时刷新的事件里面。

用了 DispatcherTimer 与System.Timers.Timer都是无法解决这个问题。写了委托。也没用......当时心真的是凉了半截。折腾了4小时。

最后终于找到了下面那个把图片转换的方法。才搞定。。。。哎微软也真的是闲的蛋疼,技术更新的好恶心。乱七八糟的。

代码太多太复杂了就不抽出了。把重点贴上上来。

//导入背景
System.Drawing.Bitmap image = new System.Drawing.Bitmap(appStartupPath + @"\map.jpg");
//转化为画布
var g = Graphics.FromImage(image);
var b = new System.Drawing.Drawing2D.LinearGradientBrush(new System.Drawing.Rectangle(0, 0, image.Width, image.Height), System.Drawing.Color.Red, System.Drawing.Color.Red, 1.2f, true);

g.DrawString("test", f, b, (float)22.2, (float)33.3);

 

BitmapImage b1=BitmapToBitmapImage(image)

JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(b1));

FileStream fileStream = new FileStream(appStartupPath + @"\Temp333.jpg", FileMode.Create, FileAccess.ReadWrite);
encoder.Save(fileStream);
fileStream.Close();

 

 

/// <summary>
/// 转自http://blog.csdn.net/yxlnmj/article/details/5801842
/// </summary>
/// <param name="bitmap"></param>
/// <returns></returns>
public BitmapImage BitmapToBitmapImage(Bitmap bitmap)
{
Bitmap bitmapSource = new Bitmap(bitmap.Width, bitmap.Height);
int i, j;
for (i = 0; i < bitmap.Width; i++)
for (j = 0; j < bitmap.Height; j++)
{
System.Drawing.Color pixelColor = bitmap.GetPixel(i, j);
System.Drawing.Color newColor = System.Drawing.Color.FromArgb(pixelColor.R, pixelColor.G, pixelColor.B);
bitmapSource.SetPixel(i, j, newColor);
}
MemoryStream ms = new MemoryStream();
bitmapSource.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(ms.ToArray());
bitmapImage.EndInit();

return bitmapImage;
}