11

pngs/tiffs などから透明度を削除して白い背景に置き換えるスムーズで高速な方法を知っている人はいますか?

基本的に私がこれを必要とするのは、PDF/A 互換の画像を作成する必要があることです。これは、仕様によれば、透過性がない可能性があります (したがって、固定の白い背景で問題ありません)。

アイデア/提案はありますか?

乾杯と感謝、-Jörg

4

6 に答える 6

10

アルファチャンネルを削除する必要があります。そうしないと、透明な領域がないだけで、透明な画像が残ります。

class Program
{
    static void Main(string[] args)
    {
        //this also works for different file formats
        ReplaceTransparency(@"C:\Y\transparent.png", System.Drawing.Color.White).Save(@"C:\Y\no_transparency.png");
        ReplaceTransparency(@"C:\Y\transparent.gif", System.Drawing.Color.White).Save(@"C:\Y\no_transparency.gif");
    }

    public static System.Drawing.Bitmap ReplaceTransparency(string file, System.Drawing.Color background)
    {
        return ReplaceTransparency(System.Drawing.Image.FromFile(file), background);
    }

    public static System.Drawing.Bitmap ReplaceTransparency(System.Drawing.Image image, System.Drawing.Color background)
    {
        return ReplaceTransparency((System.Drawing.Bitmap)image, background);
    }

    public static System.Drawing.Bitmap ReplaceTransparency(System.Drawing.Bitmap bitmap, System.Drawing.Color background)
    {
        /* Important: you have to set the PixelFormat to remove the alpha channel.
         * Otherwise you'll still have a transparent image - just without transparent areas */
        var result = new System.Drawing.Bitmap(bitmap.Size.Width, bitmap.Size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        var g = System.Drawing.Graphics.FromImage(result);

        g.Clear(background);
        g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
        g.DrawImage(bitmap, 0, 0);

        return result;
    }
}
于 2016-02-03T13:54:45.120 に答える
1

Stormenetの答えに追加します。管理されていないリソースを破棄するには、すべてのビットマップオブジェクトとグラフィックスオブジェクトを「using」ステートメントでラップすることを忘れないでください。

于 2012-05-23T23:13:04.103 に答える
0

1) 背景が白で画像と同じサイズのビットマップを作成します
2) 画像をロードして、「白い」ビットマップの上にペイントします
3) 新しく作成した画像を保存します

于 2009-03-06T10:02:23.237 に答える