2011-12-19 32 views
0

我試圖給圖像添加版權。如果圖像的分辨率低於4592x2576,它會按我的意願工作。但在第二種情況下(在這種情況下,如果分辨率等於4592x2576)會增加版權太大的規模。在C#中爲圖像添加版權 - 奇怪的行爲

查看附件瞭解詳情。

class Program 
{ 
    private static string file5 = "d:\\DSC01305.JPG"; 
    private static string file6 = "d:\\DSC01427.JPG"; 

    static void Main(string[] args) 
    { 
     AddCopyrightWithText(file5);//good 
     AddCopyrightWithText(file6);//not good 
    } 

    private const string CopyrightText = "mysite.com"; 
    private const int MaxFontSize = 190; 
    const int coefficient = 20; 

    public static void AddCopyrightWithText(string fileName) 
    { 
     using (var img = Image.FromFile(fileName)) 
     { 
      using (var gr = Graphics.FromImage(img)) 
      { 
       var color = Color.FromArgb(90, 241, 235, 105); 
       int fontSize = img.Width/coefficient; 
       if (fontSize > MaxFontSize) 
        fontSize = MaxFontSize; 

       var font = new Font("Comic Sans MS", (float)fontSize, FontStyle.Bold); 

       var stringFormat = new StringFormat(); 
       stringFormat.Alignment = StringAlignment.Center; 
       stringFormat.LineAlignment = StringAlignment.Center; 

       gr.SmoothingMode = SmoothingMode.AntiAlias; 
       int y = img.Height - (int)gr.MeasureString(CopyrightText, font, int.MaxValue).Height; 
       int x = img.Width/2; 

       gr.DrawString(CopyrightText, font, new SolidBrush(color), new Point(x, y), stringFormat); 
      } 
      using (var ms = new MemoryStream()) 
      { 
       img.Save(ms, ImageFormat.Jpeg); 
       img.Dispose(); 
       File.Delete(fileName); 
       var file = new FileStream(fileName, FileMode.Create, FileAccess.Write); 
       ms.Seek(0, SeekOrigin.Begin); 
       ms.WriteTo(file); 
       file.Close(); 
       file.Dispose(); 
      } 
     } 
    } 
} 

在第二種情況下,如果手動設置fontSize = 182(becase的在第一種情況是fontSize等於182),沒有什麼效果,其結果是一樣的!

我該如何解決?

P.S.第一個和第二個附件顯示我想要的結果,第三個和第四個顯示錯誤。在第三個附件中注意我將fontSize從190手動更改爲182

Original image below good result

Original image below good result

Original image below bad result

Original image below bad result

+1

你嘗試過不同的字體嗎?也許這是弄亂事情的字體。 – 2011-12-19 08:42:49

+1

嘗試使用[TextRenderer](http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.aspx)類('MeasureText' /'DrawText'方法)繪製字符串。它執行GDI渲染(與'Graphics.DrawString'中的GDI +渲染相反),並且通常返回更一致的結果。方法重載稍有不同,但您應該可以輕鬆修改該部分。 – Groo 2011-12-19 09:02:41

+0

@Groo,這些方法需要組裝System.Windows.Forms。在asp.net中可能嗎? – Alexandre 2011-12-19 09:13:13

回答

1

因此,有必要使用GraphicsUnit.Pixel

var font = new Font("Comic Sans MS", (float)fontSize, FontStyle.Bold, GraphicsUnit.Pixel); 

的原因是,對於Font不採取GraphicsUnit參數構造函數,將使用GraphicsUnit.Point

這涉及到某些圖像格式存儲在圖像中的DPI信息(對於其他使用系統默認值的信息)。點以英寸爲單位,因此圖像的不同DPI表示像素中的不同大小。因此,不同的圖像最終具有不同大小的文本。如果我們希望根據其DPI信息打印圖像並在每個打印輸出中具有相同大小的文本,這將非常棒。爲了使屏幕上的使用保持一致,它的像素大小非常重要,所以我們明確說明。

+0

如果你要回答自己的問題,你可以說爲什麼這個工作,以便有一個類似但不相同的問題的人可以弄清楚,而不是有一個「作品魔術」的答案,不直接轉化爲他們的案件? – 2011-12-19 11:58:05

+0

不,我不能.. – Alexandre 2011-12-19 13:00:03

+1

新增了。如果你能用你自己的話完成它,你不想這樣做。 – 2011-12-19 13:28:14