2011-12-19 19 views
0

画像に著作権を追加しようとしています。画像の解像度が4592x2576未満の場合は、私が望むように動作します。しかし、2番目のケース(解像度が4592x2576の場合)では、著作権が大きすぎます。C#で画像に著作権を追加 - 異常な動作

詳細は添付ファイルを参照してください。私は(becase最初場合fontSize182に等しい場合)手動fontSize = 182を設定した場合、影響がない第2のケースで

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(); 
      } 
     } 
    } 
} 

、結果は同じです!

どうすれば修正できますか?

P.S.最初と2番目の添付ファイルは私が望む結果を示し、3番目と4番目はバグを示しています。私はfontSizeを190から182に手動で変更しました。

Original image below good result

Original image below good result

Original image below bad result

Original image below bad result

+1

別のフォントを試しましたか?おそらくそれは物事を台無しにしているフォントです。 –

+1

[TextRenderer](http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.aspx)クラス( 'MeasureText' /' DrawText'メソッド)を使用して文字列を描画してみてください。これはGDIレンダリング( 'Graphics.DrawString'でのGDI +レンダリングとは対照的)を行い、通常はより一貫した結果を返します。メソッドのオーバーロードはわずかに異なりますが、そのパーツを簡単に変更できる必要があります。 – Groo

+0

@Grooの場合、これらのメソッドにはアセンブリSystem.Windows.Formsが必要です。 asp.netで可能ですか? – Alexandre

答えて

1

それはを使用する必要があります

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

理由は、GraphicsUnitパラメータをとらないFontのコンストラクタは、GraphicsUnit.Pointを使用します。

これは、一部のイメージ形式ではイメージに格納されているDPI情報に関連しています(他の場合は、システムのデフォルトを使用します)。点はインチに関連しているため、画像のDPIが異なるとピクセル単位のサイズが異なります。したがって、異なる画像は異なるサイズのテキストを有することになる。これはDPI情報に従って画像を印刷し、各印刷物に同じサイズのテキストを表示したい場合には素晴らしい方法です。画面上での使用が一貫しているためには、重要なピクセルサイズなので、これを明示的にします。

+0

あなた自身の質問に答えるつもりなら、なぜこれがうまくいったのかと言うことができます。そのため、類似しているが同一ではない問題を抱える人が、「魔法の作品」の答えを直接得ることはできません。場合? –

+0

いいえ、私はできません.. – Alexandre

+1

それを追加しました。あなた自身の言葉であなた自身でそれをやったことができたら、そうしたいと思わなかった。 –

関連する問題