web-dev-qa-db-ja.com

他の画像に透かし画像を配置する(C#、ASP.Net)

透かし画像を他の画像に追加するにはどうすればよいですか?

画像に透かしとしてテキストを配置することはできますが、テキストの代わりにそこに配置したい画像ができました。 C#でこれを行うにはどうすればよいですか?

もう一度具体的に言うと、画像Xがあり、透かし記号として使用したいと思います。この記号を自分のWebサイトに表示するときに、すべての画像に表示したいと思います。したがって、画像Xに画像YとZに透かしを入れます。

透かしを作成する現在のコードは次のとおりです。

public static void AddWaterMark(MemoryStream ms, string watermarkText, MemoryStream outputStream)
        {
            System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
            Graphics gr = Graphics.FromImage(img);
            Font font = new Font("Tahoma", (float)40);
            Color color = Color.FromArgb(50, 241, 235, 105);
            double tangent = (double)img.Height / (double)img.Width;
            double angle = Math.Atan(tangent) * (180 / Math.PI);
            double halfHypotenuse = Math.Sqrt((img.Height * img.Height) + (img.Width * img.Width)) / 2;
            double sin, cos, opp1, adj1, opp2, adj2;

            for (int i = 100; i > 0; i--)
            {
                font = new Font("Tahoma", i, FontStyle.Bold);
                SizeF sizef = gr.MeasureString(watermarkText, font, int.MaxValue);

                sin = Math.Sin(angle * (Math.PI / 180));
                cos = Math.Cos(angle * (Math.PI / 180));
                opp1 = sin * sizef.Width;
                adj1 = cos * sizef.Height;
                opp2 = sin * sizef.Height;
                adj2 = cos * sizef.Width;

                if (opp1 + adj1 < img.Height && opp2 + adj2 < img.Width)
                    break;
                //
            }

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

            gr.SmoothingMode = SmoothingMode.AntiAlias;
            gr.RotateTransform((float)angle);
            gr.DrawString(watermarkText, font, new SolidBrush(color), new Point((int)halfHypotenuse, 0), stringFormat);

            img.Save(outputStream, ImageFormat.Jpeg);
        }
18
Miles

gr.DrawStringを呼び出すのと同じ場所で、gr.DrawImage(position、size、overlayImage)を実行することもできます。画像からオーバーレイへの画像がPNGファイル(透明度付き)から読み込まれると、最高の品質が得られます。

12
Eric

これがGDI +を使用する別のソリューションです

GDI + for .NETを使用した透かし入り写真の作成

5
HasanG