Как установить цвет пикселей из палитры с помощью lockbits - PullRequest
0 голосов
/ 30 октября 2019

Я студент, и для прикладного программирования для курса нам нужно сделать 2 алгоритма, которые превращают изображение истинного цвета в индексированное 8-битное изображение. Мне уже удалось извлечь массив из 256 цветов из заданного изображения.

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

Когда я запускаю код, все, что я получаю, это прямоугольник первого цвета в моей палитре ( Возвращенное изображение ).

Как я могу сделать так, чтобы пиксели не все имели одинаковый цвет, а использовали цвет индекса в палитре?

public Bitmap Algoritme()
{
            Bitmap image = new Bitmap(OriginalImage.Width, OriginalImage.Height, PixelFormat.Format8bppIndexed);

            ColorPalette palette = image.Palette;
            for(int i = 0; i < Palette.Length; i++)
            {
                palette.Entries[i] = Palette[i];
            }
            image.Palette = palette;

            BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            byte[] bytes = new byte[data.Height * data.Stride];

            for(int pixelY = 0; pixelY < OriginalImage.Height; pixelY++)
            {
                for(int pixelX = 0; pixelX < OriginalImage.Width; pixelX++)
                {
                    Color originalColor = OriginalImage.GetPixel(pixelX, pixelY);
                    double distance;
                    double previousDistance = double.MaxValue;
                    Color closestColor = Color.Empty;

                    for(int i = 0; i < Palette.Length; i++)
                    {
                        distance = GetDistance(originalColor,Palette[i]);
                        if(distance < previousDistance)
                        {
                            previousDistance = distance;
                            byte newColorIndex = (byte)i;
                            bytes[pixelY * data.Stride + pixelX] = newColorIndex;
                        }
                    }


                    //image.SetPixel(pixelX, pixelY, closestColor);
                }
            }

            Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);
            image.UnlockBits(data);

            return image;
}
...