Я студент, и для прикладного программирования для курса нам нужно сделать 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;
}