2016-11-08 4 views
0

PARGBに変換)と私は、このリンクを発見した:C# - Faster Alternatives to SetPixel and GetPixel for Bitmaps for Windows Forms AppARGB私はとsetPixel(の速い別の方法を探してきた

だから私の問題は、私はイメージをしたと私はコピーを作成したいということですDirectBitmapオブジェクトとしてではなく、最初に私は、私は、このコードを使用PARGBするARGBを変換する必要があります。

public static Color PremultiplyAlpha(Color pixel) 
    { 
     return Color.FromArgb(
      pixel.A, 
      PremultiplyAlpha_Component(pixel.R, pixel.A), 
      PremultiplyAlpha_Component(pixel.G, pixel.A), 
      PremultiplyAlpha_Component(pixel.B, pixel.A)); 
    } 

    private static byte PremultiplyAlpha_Component(byte source, byte alpha) 
    { 
     return (byte)((float)source * (float)alpha/(float)byte.MaxValue + 0.5f); 
    } 

をし、ここに私のコピーコードがあります:

DirectBitmap DBMP = new DirectBitmap(img.Width, img.Height); 
     MyImage myImg = new MyImage(img as Bitmap); 

     for (int i = 0; i < img.Width; i++) 
     { 
      for (int j = 0; j < img.Height; j++) 
      { 
       Color PARGB = NativeWin32.PremultiplyAlpha(Color.FromArgb(myImg.RGB[i, j].Alpha, 
        myImg.RGB[i, j].R, myImg.RGB[i, j].G, myImg.RGB[i, j].B)); 

       byte[] bitMapData = new byte[4]; 
       bitMapData[3] = (byte)PARGB.A; 
       bitMapData[2] = (byte)PARGB.R; 
       bitMapData[1] = (byte)PARGB.G; 
       bitMapData[0] = (byte)PARGB.B; 


       DBMP.Bits[(i * img.Height) + j] = BitConverter.ToInt32(bitMapData, 0); 
      } 
     } 

MYIMAGE:ビットマップOを含むクラス各ピクセルの色を格納する構造体RGBの配列に沿って処理します。

ただし、このコードは私にはうんざりしたイメージを与えます。私は何を間違えているのですか?

+0

PARGBとは何ですか? (ちょっと好奇心が強い) –

+0

アルファを事前に乗算して、最初のリンクの答えをお読みください – Eslam

答えて

0

ビットマップデータは、水平ラインの後に水平ラインで構成されます。したがって、最後の行は次のとおりです。

+0

ありがとう!うまく動作します:) – Eslam

関連する問題