簡體   English   中英

在C#中為圖像添加版權-奇怪的行為

[英]Adding copyright to an image in C# - strange behaviour

我正在嘗試為圖像添加版權。 如果圖像的分辨率小於4592x2576 ,則可以按照我的要求工作。 但是在第二種情況下(在這種情況下,如果分辨率等於4592x2576 ),則會增加版權的大小。

請查看附件以了解詳細信息。

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 (在第一種情況下fontSize等於182 ),則沒有任何效果,結果是一樣的!

我如何解決它?

PS第一和第二個附件顯示了我想要的結果,第三個和第四個附件顯示了該錯誤。 請注意,在第三個附件中,我將fontSize手動從190更改為182

下面的原始圖片 好結果

下面的原始圖片 好結果

下面的原始圖片 不好的結果

下面的原始圖片 不好的結果

有必要使用GraphicsUnit.Pixel

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

原因是,不帶GraphicsUnit參數的Font構造函數將使用GraphicsUnit.Point

這與DPI信息有關,對於某些圖像格式,DPI信息存儲在圖像中(對於其他圖像,DPI信息使用系統默認值)。 點是相對於英寸的,因此圖像的不同DPI意味着像素大小也不同。 因此,不同的圖像最終將具有不同大小的文本。 如果我們要根據圖像的DPI信息打印圖像,並且在每個打印輸出中具有相同大小的文本,那將是很棒的。 為了使屏幕上的使用保持一致,像素大小很重要,因此我們將其明確化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM