4

私は自分のベースにペイントしたpng画像を作成しています。ベースから、参照用にpng画像を保存できます

Graphics g = e.Graphics;
 ....
g.DrawLine(pen, new Point(x, y), new Point(x1, y1));
 .....
base.OnPaint(e);

using (var bmp = new Bitmap(500, 50))
{
    base.DrawToBitmap(bmp, new Rectangle(0, 0, 500, 50));
    bmp.Save(outPath);
}

これは単色の透明画像です。この画像を任意の色で塗りつぶした png のように反転するにはどうすればよいですか。実際の画像部分は透明にする必要があります。可能性はありますか?

ビットの詳細 : 透明は非透明になり、塗りつぶしがある場所は透明になります

4

4 に答える 4

7

unsafeコードを使用する場合は、より高速な方法があります。

private unsafe void Invert(Bitmap bmp)
{
    int w = bmp.Width, h = bmp.Height;
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

    int* bytes = (int*)data.Scan0;
    for ( int i = w*h-1; i >= 0; i-- )
        bytes[i] = ~bytes[i];
    bmp.UnlockBits(data);
}

これは色を気にせず、色も反転することに注意してください。特定の色を使用する場合は、コードを少し変更する必要があります。

于 2012-07-11T08:58:01.483 に答える
6

編集( トーマス表記に感謝)

public void ApplyInvert()  
{  
    byte A, R, G, B;  
    Color pixelColor;  

    for (int y = 0; y < bitmapImage.Height; y++)  
    {  
        for (int x = 0; x < bitmapImage.Width; x++)  
        {  
            pixelColor = bitmapImage.GetPixel(x, y);  
            A = (byte)(255 - pixelColor.A); 
            R = pixelColor.R;  
            G = pixelColor.G;  
            B = pixelColor.B;  
            bitmapImage.SetPixel(x, y, Color.FromArgb((int)A, (int)R, (int)G, (int)B));  
        }  
    }  
}

ここから : C# での画像処理: 画像の反転

于 2012-07-11T08:48:08.457 に答える
0

透明部分を色に反転すると言うとき、完全な透明に設定されたばかりの PNG 画像に実際の色を保存していますか? 多くのプログラムは、透明度から色データを削除して png を最適化するため、元に戻すことはできません。

色は透明に変換できますが、透明 (下にある色がない) は色に変換できません。

運が良ければ、PNG は最適化されず、元のカラー データはそのまま残りますが、ユーザー入力からこれを行うと、ほとんどの場合は機能しません。

于 2012-07-11T09:51:42.360 に答える