应用简单的水印后图像大小急剧增加

我有一组图像,我编程方式使用System.WindowsSystem.Windows.Media.Imaging (是的,而不是与GDI +)按照这里的教程绘制一个简单的水印。

大多数图像不超过500Kb ,但是在应用简单的水印(这是具有透明背景的文本)之后,图像大小急剧增加。

例如,使用下面的方法应用水印后, 440Kb的图像变为8.33MB ,这让我感到震惊。

 private static BitmapFrame ApplyWatermark(BitmapFrame image, string waterMarkText) { const int x = 5; var y = image.Height - 20; var targetVisual = new DrawingVisual(); var targetContext = targetVisual.RenderOpen(); var brush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFFFFF")); brush.Opacity = 0.5; targetContext.DrawImage(image, new Rect(0, 0, image.Width, image.Height)); targetContext.DrawRectangle(brush, new Pen(), new Rect(0, y, image.Width, 20)); targetContext.DrawText(new FormattedText(waterMarkText, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Batang"), 13, Brushes.Black), new Point(x, y)); targetContext.Close(); var target = new RenderTargetBitmap((int)image.Width, (int)image.Height, 96, 96, PixelFormats.Default); target.Render(targetVisual); var targetFrame = BitmapFrame.Create(target); return targetFrame; } 

我注意到,与原始图像相比,图像质量得到了改善。 图像更平滑,颜色更浅。 但是,你知道我真的不想要这个。 我希望图像保持原样,但包含水印。 没有质量的提高,当然也不会影响图像的大小。

在这里有没有什么设置可以告诉我的程序保持与源图像一样的质量? 在ApplyWatermark方法发生变化后,如何防止图像大小发生重大变化?

编辑

这是我如何转换BitmapFrameStream 。 然后,我使用该Stream将图像保存到AmazonS3

 private Stream EncodeBitmap(BitmapFrame image) { BitmapEncoder enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(image)); var memoryStream = new MemoryStream(); enc.Save(memoryStream); return memoryStream; } 

2.这是我如何从Stream获取BitmapFrame

 private static BitmapFrame ReadBitmapFrame(Stream stream) { var photoDecoder = BitmapDecoder.Create( stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); return photoDecoder.Frames[0]; } 

这是我从本地目录读取文件的方式

 public Stream FindFileInLocalImageDir() { try { var path = @"D:\Some\Path\Image.png"; return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception) { return null; } } 

Solutions Collecting From Web of "应用简单的水印后图像大小急剧增加"

之前在评论中问我的问题的原因是因为我注意到有几种不同的编码器可用。 位图通常具有显着更大的文件大小,因为它存储的图像信息量较大。

我自己没有测试过,但是你试过了不同的编码器吗?

 var pngEncoder = new PngBitmapEncoder(); pngEncoder.Frames.Add(ApplyWatermark(null, null)); MemoryStream stm = File.Create(image); pngEncoder.Save(stm); return stm; 

问题是,当你编辑图像时,压缩消失了。 一张730×1108的JPG格式,与32bit的433kB光盘大小(你提到透明度,所以ARGB)至少需要730 * 1108 * 4 = 3,09MB的光盘。 当然,你可以再次压缩它(对于光盘,还有其他的网络流)。

这就是图像软件处理压缩数据时总是需要大量内存的原因。

结论:您将需要可用的内存来处理图像。 完全没有可能完成。