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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> руками transparent bitmap, как че-нить нарисовать на прозрачном... 
:(
    Опции темы
StepS
Дата 27.11.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

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



всем привет. Простой вопрос. Создаю bitmap:
Код

    protected void Page_Load(object sender, EventArgs e) {
        string strMarkerSize = ConfigurationManager.AppSettings[ConfigurationKeys.MarkerIconSize];
        Response.Clear();
//        Response.ContentType = "image/gif";
        int iconWidth, iconHeight;
        if(strMarkerSize.Split(',').Length >= 2) {
            iconWidth = int.Parse(strMarkerSize.Split(',')[0].Trim());
            iconHeight = int.Parse(strMarkerSize.Split(',')[1].Trim());
        } else {
            iconWidth = 15;
            iconHeight = 20;
        }
        using (Bitmap icon = new Bitmap(iconWidth, iconHeight)) {
            using (Graphics graphIcon = Graphics.FromImage(icon)) {
                int red = 255;
                int green = 255;
                int blue = 233;
                int borderWidth = 2;
                graphIcon.FillPolygon(new SolidBrush(Color.Green), new PointF[] {
                                                                                         new PointF(0, 0),
                                                                                         new PointF(iconWidth, 0), 
                                                                                         new PointF(iconWidth, iconHeight), 
                                                                                         new PointF(0, iconHeight) 
                                                                                     });
                graphIcon.FillPolygon(new SolidBrush(Color.FromArgb(red, green, blue)),
                                      new PointF[] {
                                                       new PointF(borderWidth,borderWidth),
                                                       new PointF(borderWidth, 2*iconHeight/3-borderWidth), 
                                                       new PointF(iconWidth/2, iconHeight -borderWidth), 
                                                       new PointF(iconWidth-borderWidth, 2*iconHeight/3-borderWidth), 
                                                       new PointF(iconWidth - borderWidth, borderWidth)
                                                   }
                    );
                graphIcon.DrawPolygon(new Pen(Color.Green, 2),
                                      new PointF[] {
                                                       new PointF(1,1),
                                                       new PointF(1, 2*iconHeight/3), 
                                                       new PointF(iconWidth/2, iconHeight), 
                                                       new PointF(iconWidth, 2*iconHeight/3), 
                                                       new PointF(iconWidth, 1)
                                                   });
                icon.MakeTransparent(Color.Green);
                using (MemoryStream stream = new MemoryStream()) {
                    icon.Save(stream, ImageFormat.Gif);
                    stream.WriteTo(Response.OutputStream);
                }
            }
        }



он на странице мне выводится  на черном прямоугольнике  smile  Кто знает как сделать этот черный прямоугольник прозрачным?
icon.MakeTransparent(Color.Black); - пробовал
раскоментить тип контента тоже пробовал
сменить вывод картинки в другом формате тоже пробовал
делать icon.GetPixel() и потом выставить Transparent тоже пробовал - ничего не помогло.
PM MAIL ICQ   Вверх
Mymik
Дата 27.11.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 24.7.2007
Где: Днепропетровск

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



Дело может быть в браузере - например ИЕ 6 полноценно не поддерживает прозразчность (а тем более полупрозрачность и т.д.).

Попробуй на Огненом Лисе или Опере - они полноценно поддерживают.

Если дело в этом конечно.


PM MAIL   Вверх
Mymik
Дата 27.11.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Запустил я твой пример. Проблема совсем в другом. Проблема в твоих расчетах. Ты сам ошибочно рисуешь свое изображение.
Так что исправляй расчеты сделай поправку на borderWidth. Отступай отовсюду. И сделать первоначальную заливку прозрачной.


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

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

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



Mymik, спасибо, попробую отпишусь.

Добавлено через 12 минут и 10 секунд
сделал вот так:
Код

   protected void Page_Load(object sender, EventArgs e) {
        string strMarkerSize = ConfigurationManager.AppSettings[ConfigurationKeys.MarkerIconSize];
        Response.Clear();
//        Response.ContentType = "image/gif";
        int iconWidth, iconHeight;
        if(strMarkerSize.Split(',').Length >= 2) {
            iconWidth = int.Parse(strMarkerSize.Split(',')[0].Trim());
            iconHeight = int.Parse(strMarkerSize.Split(',')[1].Trim());
        } else {
            iconWidth = 15;
            iconHeight = 20;
        }
        using (Bitmap icon = new Bitmap(iconWidth, iconHeight)) {
            using (Graphics graphIcon = Graphics.FromImage(icon)) {
                int red = 255;
                int green = 255;
                int blue = 233;
                int borderWidth = 2;
                graphIcon.FillPolygon(new SolidBrush(Color.Transparent), new PointF[] {
                                                                                         new PointF(0, 0),
                                                                                         new PointF(iconWidth, 0), 
                                                                                         new PointF(iconWidth, iconHeight), 
                                                                                         new PointF(0, iconHeight) 
                                                                                      });
                 graphIcon.FillPolygon(new SolidBrush(Color.FromArgb(red, green, blue)),
                                      new PointF[] {
                                                       new PointF(2*borderWidth,2*borderWidth),
                                                       new PointF(2*borderWidth, 2*iconHeight/3-2*borderWidth), 
                                                       new PointF(iconWidth/2, iconHeight -2*borderWidth), 
                                                       new PointF(iconWidth-2*borderWidth, 2*iconHeight/3-2*borderWidth), 
                                                       new PointF(iconWidth - 2*borderWidth, 2*borderWidth)
                                                   }
                    );
                graphIcon.DrawPolygon(new Pen(Color.Green, 1),
                                      new PointF[] {
                                                       new PointF(borderWidth,borderWidth),
                                                       new PointF(borderWidth, 2*iconHeight/3), 
                                                       new PointF(iconWidth/2, iconHeight - borderWidth), 
                                                       new PointF(iconWidth - borderWidth, 2*iconHeight/3), 
                                                       new PointF(iconWidth - borderWidth, borderWidth)
                                                   });
                icon.MakeTransparent(Color.Black);
                using (MemoryStream stream = new MemoryStream()) {
                    icon.Save(stream, ImageFormat.Gif);
                    stream.WriteTo(Response.OutputStream);
                }
            }
        }


все равно черный фон остался. :(
пробовал в мозиле - та же фигня.
PM MAIL ICQ   Вверх
dazy
Дата 17.12.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    private static byte[] ResizeImageFile(byte[] imageFile, int targetSize) {
        using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile))) {
            Size newSize = CalculateDimensions(oldImage.Size, targetSize);
            using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppArgb)) {
                using (Graphics canvas = Graphics.FromImage(newImage)) {
                    canvas.Clear(Color.Transparent);
                    canvas.SmoothingMode = SmoothingMode.HighQuality;
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
                    MemoryStream m = new MemoryStream();
                    newImage.Save(m, ImageFormat.Png);
                    return m.GetBuffer();
                }
            }
        }
    }

Чтобы пользоваться прозрачностью, надо использовать формат битмапа с поддержкой альфа канала (например PixelFormat.Format32bppArgb, здесь Argb, Значит Альфа + RGB), если такой тип не объявить принудительно, то в вашем битмапе просто нет места для прозрачности, и она заменяется черным. И правильно, какой код RGB обозначет прозрачность? А никакой! Прозрачность это отдельная, четвертая, составляющия изображения, при создании битмапа нужно в явном виде указать, что вы хотите ей пользоваться.
Вы сохраняете результат в Gif - возможно будете страдать от того, как .Net будет переводить ваши цвета в 256 цветную палитру gif'a. Сделать хороший gif в .Net, не так просто . Пользуйтесь сразу .png - меньше проблем.

Ниже код, для пропорционального уменьшения изображения. Новое изображение вписывается в квадрат размером targetSize*targetSize. Посмотрите, может пригодтиться.


Код

    private static Size CalculateDimensions(Size oldSize, int targetSize) {
        Size newSize = new Size();
        if (oldSize.Height > oldSize.Width) {
            newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
            newSize.Height = targetSize;
        }
        else {
            newSize.Width = targetSize;
            newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
        }
        return newSize;
    }

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

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

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

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


 




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


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

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