Разница между преобразованием изображения с помощью матрицы цветов или с помощью Bitmap.SetPixel - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть следующие коды, которые преобразуют пиксели изображения:

  1. Преобразование с использованием ColorMatrix

     Bitmap bmpOut = null;
    
    if (DisplayImage == null)
    {
        return;
    }
    
    bmpOut = GetBitmapFromImageSoure(OriginalImage.Source);
    
    Bitmap originalImage = bmpOut;
    Bitmap adjustedImage = new Bitmap(bmpOut.Width, bmpOut.Height);
    float brightness = (float)BrightnessSlider.Value;
    float contrast = (float)ContrastSlider.Value;
    float gamma = (float)GammaSlider.Value;
    float alpha = (float)AlphaSlider.Value;
    
    float adjustedBrightness = brightness - 1.0f;
    
    // create matrix that will brighten and contrast the image
    float[][] ptsArray ={
                        new float[] {contrast, 0, 0, 0, 0}, // scale red
                        new float[] {0, contrast, 0, 0, 0}, // scale green
                        new float[] {0, 0, contrast, 0, 0}, // scale blue
                        new float[] {0, 0, 0, alpha, 0},    // scale alpha
                        new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}};    // brightness
    
    ImageAttributes imageAttributes = new ImageAttributes();
    
    imageAttributes.ClearColorMatrix();
    imageAttributes.SetColorMatrix(new ColorMatrix(ptsArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    imageAttributes.SetGamma(gamma, ColorAdjustType.Bitmap);
    
    Graphics g = Graphics.FromImage(adjustedImage);
    
    g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, adjustedImage.Width, adjustedImage.Height)
        , 0, 0, originalImage.Width, originalImage.Height,
        GraphicsUnit.Pixel, imageAttributes);
    
    this.DisplayImage.Source = ConvertToBitmapImage(adjustedImage);
    
  2. Изменение каждого пикселя для преобразования всерая шкала

    Bitmap original = GetBitmapFromImageSoure(OriginalImage.Source);
    Bitmap converted = (Bitmap)original.Clone();
    
    System.Drawing.Color c;
    
    for (int i = 0; i < converted.Width; i++)
    {
        for (int j = 0; j < converted.Height; j++)
        {
            c = converted.GetPixel(i, j);
    
            byte gray = (byte)(.299 * c.R + .587 * c.G + .114 * c.B);
    
            converted.SetPixel(i, j, System.Drawing.Color.FromArgb(gray, gray, gray));
        }
    }
    
    DisplayImage.Source = ConvertToBitmapImage(converted);
    

Первый способ заключается в изменении яркости, гаммы, контрастности изображения, которое контролируется с помощью ползунка и непосредственно обрабатывает изображение.

В то время как второй метод требует времени для обработки того же изображения только с помощью флажка.

Почему используется цветовая матрица быстрее и как она работает лучше, чем изменение каждого пикселя в цикле.

...