Графика на индексированном изображении
Я получаю ошибку:
"Графический объект не может быть создан из изображения с индексированным пиксельный формат."
в функции:
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();
}
Я хотел бы спросить вас, как я могу это исправить?
Ответы
Ответ 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-битными изображениями?