Rose debug info
---------------

Как поместить надпись на картинку GIF/Jpeg

Задача: поместить надпись на картинку GIF.

При использовании вот такого кода:

Bitmap myBitmap = new Bitmap("myimg.gif");
Graphics g = Graphics.FromImage(myBitmap);

Возникает исключение «A Graphics object cannot be created from an image that has an indexed pixel format.»

indexed format — это формат, где каждый пиксел изображения представлен индексом в палитре. Например, в индексированном формате 8bpp каждый пиксел — байт 0..255, индекс в таблице из 256 цветов. Индексированные форматы — 1bpp, 4bpp, 8bpp. С JPEG такой ошибки не возникает.

А избежать вышеупомянутого исключения можно при помощи создания нового битмапа с размерами оригинала и вывода в него исходного изображения при помощи DrawImage (пример ниже).

{
Response.ContentType = "image/gif";
Bitmap myBitmap = new Bitmap(Server.MapPath("myimg.gif")); // берем изображение GIF 
Bitmap tmp = new Bitmap(myBitmap.Width, myBitmap.Height); // создаем новый битмап
Graphics g = Graphics.FromImage(tmp);
//выгружаем оригинальный битмап в новый.
g.DrawImage(myBitmap, new Rectangle(0, 0, tmp.Width, tmp.Height), 0, 0, myBitmap.Width, myBitmap.Height, GraphicsUnit.Pixel);
//помещаем текст в левый верхний угол
g.DrawString("привет!", new Font("Times New Roman", 12), Brushes.Black, new PointF(0, 0));
//сохраняем, отправляем в браузер
tmp.Save(Response.OutputStream, ImageFormat.Gif); 
Response.End();
}
2 комментария
Михаил 2009

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

г-н Тараканофф 2010

Спасибо за пост :) Понадобился при подписывании загружаемых картинок.