Подтвердить что ты не робот

Графика на индексированном изображении

Я получаю ошибку:

"Графический объект не может быть создан из изображения с индексированным пиксельный формат."

в функции:

public static void AdjustImage(ImageAttributes imageAttributes, Image image)
{
        Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);

        Graphics g = Graphics.FromImage(image);       
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageAttributes);
        g.Dispose();
}

Я хотел бы спросить вас, как я могу это исправить?

4b9b3361

Ответ 1

Ссылаясь на this, его можно решить, создав пустую растровую карту с такими же размерами и правильным PixelFormat и рисованием на этом растровом изображении.

// The original bitmap with the wrong pixel format. 
// You can check the pixel format with originalBmp.PixelFormat
Bitmap originalBmp = new (Bitmap)Image.FromFile("YourFileName.gif");

// Create a blank bitmap with the same dimensions
Bitmap tempBitmap = new Bitmap(originalBmp.Width, originalBmp.Height);

// From this bitmap, the graphics can be obtained, because it has the right PixelFormat
using(Graphics g = Graphics.FromImage(tempBitmap))
{
    // Draw the original bitmap onto the graphics of the new bitmap
    g.DrawImage(originalBmp, 0, 0);
    // Use g to do whatever you like
    g.DrawLine(...);
}

// Use tempBitmap as you would have used originalBmp
return tempBitmap;

Ответ 2

Самый простой способ - создать новое изображение следующим образом:

Bitmap EditableImg = new Bitmap(IndexedImg);

Создает новое изображение точно так же, как оригинал, со всем его содержимым.

Ответ 3

В целом, если вы хотите работать с проиндексированными изображениями и фактически сохранить их глубину цвета и палитру, это всегда будет означать написание явных проверок и специального кода для них. Graphics просто не может работать с ними, потому что она манипулирует цветами, а фактические пиксели индексированных изображений не содержат цветов, только индексы.

Для тех, кто все еще видит это все эти годы спустя... правильный способ нарисовать изображение на существующем (8-битном) проиндексированном изображении это:

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

Это непростая задача, но, безусловно, возможно. Если вставленное изображение также проиндексировано и содержит более 256 пикселей, вы можете ускорить процесс, выполнив сопоставление цветов на палитре, а не на реальных данных изображения, затем получите вспомогательные байты из другого проиндексированного изображения и переназначьте их используя созданное отображение.

Обратите внимание, что все это относится только к восьмибитным. Если ваше изображение является четырехбитным или однобитным, самый простой способ обработать его - сначала преобразовать его в 8-битный, чтобы вы могли обрабатывать его как один байт на пиксель, а затем преобразовывать обратно.

Для получения дополнительной информации см. Как я могу работать с 1-битными и 4-битными изображениями?