2012-10-07 23 views
2

我有以下任务。拍摄一张基本图像并在其上覆盖另一张。基本图像是8b PNG以及覆盖。 这里是基础(左)和覆盖(右)图像。.NET中的Png图像处理

Overlay image Overlay image

这里是一个结果,以及它如何必须寻找。

enter image description here enter image description here

在左边的图片是一个屏幕截图,当一个画面是在另一个之上(html和定位)和第二个是编程合并的结果。

正如您在屏幕截图中看到的那样,文字的边框较暗。而且,这里是图像

  • 基地图像14.9 KB
  • 叠加图像6.87 KB
  • 结果图像的大小34.8 KB

所得图像的大小也是巨大的

这里是我用来合并这些图片的代码

/*...*/ 
public Stream Concatinate(Stream baseStream, params Stream[] overlayStreams) { 
    var @base = Image.FromStream(baseStream); 
    var canvas = new Bitmap(@base.Width, @base.Height); 
    using (var g = canvas.ToGraphics()) { 
     g.DrawImage(@base, 0, 0); 
     foreach (var item in overlayStreams) { 
      using (var overlayImage = Image.FromStream(item)) { 
       try { 
        Overlay(@base as Bitmap, overlayImage as Bitmap, g); 
       } catch { 

       } 
      } 
     } 
    } 
    var ms = new MemoryStream(); 
    canvas.Save(ms, ImageFormat.Png); 
    canvas.Dispose(); 
    @base.Dispose(); 
    return ms; 
} 

/*...*/ 
/*Tograpics extension*/ 
public static Graphics ToGraphics(this Image image, 
    CompositingQuality compositingQuality = CompositingQuality.HighQuality, 
    SmoothingMode smoothingMode = SmoothingMode.HighQuality, 
    InterpolationMode interpolationMode = InterpolationMode.HighQualityBicubic) { 
    var g = Graphics.FromImage(image); 

    g.CompositingQuality = compositingQuality; 
    g.SmoothingMode = smoothingMode; 
    g.InterpolationMode = interpolationMode; 
    return g; 
} 
private void Overlay(Bitmap source, Bitmap overlay, Graphics g) { 
    if (source.Width != overlay.Width || source.Height != overlay.Height) 
     throw new Exception("Source and overlay dimensions do not match"); 
    var area = new Rectangle(0, 0, source.Width, source.Height); 
    g.DrawImage(overlay, area, area, GraphicsUnit.Pixel); 
} 

我的问题是

  • 我应该以合并图像来实现的结果的截图吗?
  • 如何降低结果图像的大小?
  • System.Drawing是一个合适的工具吗?还是有更好的工具来处理PNG的.NET?
+0

嗯..很有趣........ – Anirudha

回答

3

的问题的答案是: 1)只需拨打方法ToGraphics有说法CompositingQuality.Default而不是使用像例如默认参数值:

using (var g = canvas.ToGraphics(compositingQuality: CompositingQuality.Default)) 

问题是与CompositingQuality。 HighQuality是它将两幅图像合成为一幅,但是您想制作一个覆盖图,而不是将两幅图像合成。

2)大小与您指定的大小相似,不能更改,这是由于图像格式。 3)如果你是用c#编程的桌面,比我所知的System.Drawing是最好的选择。

+0

非常感谢。你关于'CompositingQuality'的建议确实有帮助。 – Oybek