2012-10-07 48 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