2016-11-08 4 views
0

Я искал быстрый альтернативный метод SetPixel(), и я нашел эту ссылку: C# - Faster Alternatives to SetPixel and GetPixel for Bitmaps for Windows Forms AppПреобразование ARGB в PARGB

Так что моя проблема в том, что я имею изображение, и я хочу, чтобы создать копию как объект DirectBitmap но сначала мне нужно преобразовать ARGB в PARGB поэтому я использовал этот код:

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: класс, содержащий Bitmap O bject вместе с массивом struct RGB, сохраняющим цвета каждого пикселя

Однако этот код дает мне испорченное изображение. Что я делаю не так?

+0

Что такое PARGB? (не каламбур. Просто любопытно) –

+0

premultiplied Alpha, пожалуйста, прочитайте ответ в первой ссылке – Eslam

ответ

0

Данные растровых изображений организованы горизонтальной линией после горизонтальной линии. Поэтому ваша последняя строка должна быть:

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

Спасибо! работает просто отлично :) – Eslam

Смежные вопросы