Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написать на картинке 
:(
    Опции темы
Vit
Дата 2.6.2007, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Задача - загрузить картинку, нарисовать на ней надпись, вывести в выходной поток. Код который в первом приближении работает написал:

Код

  System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath(null) + @"\title.gif");
  Bitmap bmp = new Bitmap(img.Width, img.Height);
  Graphics g = Graphics.FromImage(bmp);
  g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
  Font f = new Font("Arial", 8);
  g.DrawString("Какой-то текст", f, Brushes.Red, new Point(10,10));

  Response.ContentType = "image/jpg"; //(1)
  Response.Clear();
  Response.BufferOutput = true;
  bmp.Save(Response.OutputStream, ImageFormat.Jpeg); //(2)
  Response.Flush();
  bmp.Dispose();
  g.Dispose();
  img.Dispose();


Косяк в том что выходной поток формируется формата Jpeg поэтому текст виден на редко хреново, "jpg-муар" вокруг букв настолько сильный, что текст вообще не видать. Попытки менять формат в строках обозначенных (1) и (2) приводят к тому что программу просто выбивает по "неперехваченной" ошибке GDI+ без всякого осмысленного описания сути ошибки. А посему возникают вопросы:

1. Как вывести поток в формате png или bmp?

2. Как регулировать глубину jpg компрессии при работе? Меня бы устроило вместо дегенеративной охрененно сильной компрессии jpg относительно слабая компрессия когда можно достичь приемлимого качества хотя бы в минимальном приближении.

3. Как вообще конвертировать один формат в другой?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Mymik
Дата 2.6.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Цитата(Vit @  2.6.2007,  05:01 Найти цитируемый пост)
1. Как вывести поток в формате png или bmp?

Изменить флажек ImageFormat.

Цитата(Vit @  2.6.2007,  05:01 Найти цитируемый пост)
3. Как вообще конвертировать один формат в другой? 

При выполнении 11 строчки кода, автоматически конвертируется формат.


Цитата(Vit @  2.6.2007,  05:01 Найти цитируемый пост)
Попытки менять формат в строках обозначенных (1) и (2) приводят к тому что программу просто выбивает по "неперехваченной" ошибке GDI+ без всякого осмысленного описания сути ошибки.

А на что ты менял ??? вообще ошибки не должно быть. Она должна быть где-то в другом месте тогда. 


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
Vit
Дата 2.6.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата(Mymik @  2.6.2007,  02:21 Найти цитируемый пост)
А на что ты менял ??? вообще ошибки не должно быть. Она должна быть где-то в другом месте тогда



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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Mymik
Дата 2.6.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Vit, ошибка 1000% в другом месте
В аттаче архив состоящих из трех файлов
Default5.aspx -- пустая страница
Default5.aspx.cs -- изменение изображения
ept.jpg -- изображение (первое попавшееся из поиска в гугле по слову "картинка" :о) )

Работает все идеально. Изменил 8 строчку на 
Код

Response.ContentType = "image/gif"; //(1)

Изменил 11 строку на 
Код

bmp.Save(Response.OutputStream, ImageFormat.Gif); //(2)

Сгенерированное изображение плохого качества, но и текст и картинка есть.

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  send.rar 10,08 Kb


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
Vit
Дата 2.6.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



А если изначально загружается файл Gif?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Mymik
Дата 2.6.2007, 19:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Vit, все равно все нормально...


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
Vit
Дата 2.6.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Взял твой пример, с jpg и c gif работает нормально, а в bmp - эта же ошибка, вот этот код не работает:

Код

    protected void Page_Load(object sender, EventArgs e)
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath(null) + @"\ept.JPG");
        Bitmap bmp = new Bitmap(img.Width, img.Height);
        Graphics g = Graphics.FromImage(bmp);
        g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
        Font f = new Font("Arial", 8);
        g.DrawString("Какой-то текст", f, Brushes.Green, new Point(100, 100));
        Response.ContentType = "image/bmp"; //(1)
        Response.Clear();
        Response.BufferOutput = true;
        bmp.Save(Response.OutputStream, ImageFormat.Bmp); //(2)
        Response.Flush();
        bmp.Dispose();
        g.Dispose();
        img.Dispose();
    }


Gif не подходит, этот Image/Graphics/Bitmap объект (уж не знаю какой из них) неправильно индексирует цвета при выводе в Gif формате. Для того чтобы Gif выглядел хорошо нормальные редакторы выбирают не абы какие 256 цветов палитры, а именно те которые наиболее представленны на рисунке. Создатели GDI+ видимо об этом и слыхом не слыхивали или просто схалтурили, проиндексировав цвета как бог на душу пошлёт, а потому вопрос можно сформулировать следующим образом:

1. Как мне вывести картинку в любом формате который поддерживает как минимум 15K цветов, а лучше 24 битный цвет без потери качества в следствии компрессии или с горазо меньшими потерями который даёт стандартный уровень компрессии JPG

2. Как конвертировать форматы изображения:

   BMP -> JPG  - Так чтобы можно было определять уровень компрессии вручную

   BMP -> GIF , JPG -> GIF - Так чтобы можно было настраивать палитры цветов.

Пока задача не решена и даже близко не ясно как её решать.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Naum
Дата 4.6.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 2
Всего: 15



У метода Image.Save есть перегрузка, которая в качестве параметра принимает System.Drawing.Imaging.EncoderParameters. Давненько я их использовал, поэтому, Vit, извини, конкретного ничего подсказать не могу. Но всегда можно посмотреть примеры в MSDN.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
dazy
Дата 4.6.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 4
Всего: 8



Может, использовать формат .png? Очень хороший формат.
PM MAIL   Вверх
Vit
Дата 4.6.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата(dazy @  4.6.2007,  02:38 Найти цитируемый пост)
Может, использовать формат .png? Очень хороший формат. 



Как? если так как указано в приведенном куске кода то вылетает та же ошибка.
Цитата(Naum @  4.6.2007,  01:16 Найти цитируемый пост)
У метода Image.Save есть перегрузка, которая в качестве параметра принимает System.Drawing.Imaging.EncoderParameters.



Спасибо, попробую


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dazy
Дата 4.6.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 4
Всего: 8



Цитата(Vit @  4.6.2007,  18:58 Найти цитируемый пост)
Как? если так как указано в приведенном куске кода то вылетает та же ошибка.


Вот так:
Код

public partial class Default5 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath(null) + @"\ept.JPG");
        Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb);
        Graphics g = Graphics.FromImage(bmp);
        g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
        Font f = new Font("Arial", 8);
        g.DrawString("Какой-то текст", f, Brushes.Red, new Point(100, 100));
        Response.ContentType = "image/png"; 
        Response.Clear();
        Response.BufferOutput = true;
        MemoryStream mem = new MemoryStream();
        bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Png);
        mem.WriteTo(Response.OutputStream); 
        Response.Flush();
        bmp.Dispose();
        g.Dispose();
        img.Dispose();
    }
}


Малость поправил код Mymik`а.
Ну, понятно что png надо в <img> оборачивать.
В строчках 6, 9-12 можно поиграть с качеством отрисовки.
Самое важное - строки 18-20.
С png нельзя использовать метод Bitmap.Save() сразу в выходной поток, так как при сохранении png нужен поток внутри которого можно перемещаться назад и вперед. Выходной поток Response.OutputStream - односторонее движение. Поэтому промежуточно сохраняем картинку в MemoryStream а потом уже в Response.OutputStream.

p.s. Netscape 4.x не поддерживает png.
p.p.s Если поменять на Jpeg, то у меня выводит ошибку XML, если обернуть картинку в <img> то все нормально, png-же показвает и без обертки (в ie7).

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.