ниче не пойму...
От: oRover Украина  
Дата: 18.04.04 11:48
Оценка:
с графикой. Точнее "что от чего зависит".
Может кто мне растолкует

пример №1
полупрозрачная картинка
пишу такой код

            Bitmap bmp = new Bitmap("..\\..\\0005.jpg");
            
            Bitmap bmp2 = (Bitmap)bmp.Clone();
            for (Single x=0; x<bmp2.Width; x++)
                for (int y=0; y<bmp2.Height; y++)
                {
                    Color oldColor = bmp2.GetPixel((int)x, (int)y);
                    Color newColor = Color.FromArgb(100, oldColor);
                    bmp2.SetPixel((int)x, (int)y, newColor);
                }
            this.pictureBox1.Image = bmp2;


работает. Но стоит мне убрать сточку
Bitmap bmp2 = (Bitmap)bmp.Clone();

(и соответственно везде заменить bmp2 на bmp) то все, картинка уже с альфа=255. Какого х..? Почему не задается SetPixel для исходного битмапа, а только для клона? чем он вообще отличается?

пример №2
            Bitmap bmp = new Bitmap("..\\..\\0005.jpg");
            
            Bitmap bmp2 = (Bitmap)bmp.Clone();
            for (Single x=0; x<bmp2.Width; x++)
                for (int y=0; y<bmp2.Height; y++)
                {
                    Color oldColor = bmp2.GetPixel((int)x, (int)y);
                    Color newColor = Color.FromArgb(100, oldColor);
                    bmp2.SetPixel((int)x, (int)y, newColor);
                }

            Graphics gr = Graphics.FromImage(bmp2);
            gr.DrawLine(new Pen(Color.Violet), 0, 0, 100, 100);
            gr.Flush();

            System.IO.MemoryStream MS = new System.IO.MemoryStream();
            bmp2.Save(MS,System.Drawing.Imaging.ImageFormat.Jpeg);
            
            this.pictureBox1.Image = Image.FromStream(MS);


выводит картинку с соответствующей линией. А вот какого х.. она опять непрозрачная? мы же убедились в примере №1 что bmp2 "на выходе" с альфа=100. Чего когда я делаю
            Graphics gr = Graphics.FromImage(bmp2);

альфа уже 255?


делаем такой винт ушами — оставляем такой код
            Bitmap bmp2 = (Bitmap)bmp.Clone();
            for (Single x=0; x<bmp2.Width; x++)
                for (int y=0; y<bmp2.Height; y++)
                {
                    Color oldColor = bmp2.GetPixel((int)x, (int)y);
                    Color newColor = Color.FromArgb(100, oldColor);
                    bmp2.SetPixel((int)x, (int)y, newColor);
                }

            System.IO.MemoryStream MS = new System.IO.MemoryStream();
            bmp2.Save(MS,System.Drawing.Imaging.ImageFormat.Jpeg);//png codec can't save to un-seekable array (see details in KnowledgeBase)
            
            this.pictureBox1.Image = Image.FromStream(MS);


опять альфа=255. Т.е. запись в поток поганит альфа-канал?
... << RSDN@Home 1.1.3 stable >>

19.04.04 16:55: Перенесено модератором из '.NET' — AVK
Re: ниче не пойму...
От: Rumata Россия http://atamur.livejournal.com
Дата: 18.04.04 12:20
Оценка:
Здравствуйте, oRover, Вы писали:

R>с графикой. Точнее "что от чего зависит".

R>Может кто мне растолкует

Могу добавить свои наблюдегния:
Если грузить картинку (битмап) из файла через конструктор битмапа, то получается 24 битный rgb формат, а если через конструктор Image — то 32 битный Argb

Тайна сия великая есть =))
Re[2]: ниче не пойму...
От: oRover Украина  
Дата: 18.04.04 14:40
Оценка:
Здравствуйте, Rumata, Вы писали:

R>Могу добавить свои наблюдегния:

R>Если грузить картинку (битмап) из файла через конструктор битмапа, то получается 24 битный rgb формат, а если через конструктор Image — то 32 битный Argb

R>Тайна сия великая есть =))


чего, в моем примере создается через конструктор битмапа и Argb

            Bitmap bmp = new Bitmap("..\\..\\0005.jpg");
            
            Bitmap bmp2 = (Bitmap)bmp.Clone();
            for (Single x=0; x<bmp2.Width; x++)
                for (int y=0; y<bmp2.Height; y++)
                {
                    Color oldColor = bmp2.GetPixel((int)x, (int)y);
                    Color newColor = Color.FromArgb(100, oldColor);
                    bmp2.SetPixel((int)x, (int)y, newColor);
                }
            this.pictureBox1.Image = bmp2;
... << RSDN@Home 1.1.3 stable >>
Re[3]: ниче не пойму...
От: Rumata Россия http://atamur.livejournal.com
Дата: 18.04.04 14:55
Оценка:
Здравствуйте, oRover, Вы писали:

R>Здравствуйте, Rumata, Вы писали:


R>>Могу добавить свои наблюдегния:

R>>Если грузить картинку (битмап) из файла через конструктор битмапа, то получается 24 битный rgb формат, а если через конструктор Image — то 32 битный Argb

R>>Тайна сия великая есть =))


R>чего, в моем примере создается через конструктор битмапа и Argb


Проверь через PixelFormat (юзай класс Enum, чтобы распечатать)
Re: ниче не пойму...
От: Аноним  
Дата: 18.04.04 17:32
Оценка:
Здравствуйте, oRover, Вы писали:

У меня такая же хрень была, по-моему решал также, т.е. клоны создавал
Только операции GetPixel и SetPixel очень тормозные, попробуй лучше
Marshal.ReadByte и Marshal.WriteByte
Re[2]: ниче не пойму...
От: Rumata Россия http://atamur.livejournal.com
Дата: 19.04.04 11:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня такая же хрень была, по-моему решал также, т.е. клоны создавал

А>Только операции GetPixel и SetPixel очень тормозные, попробуй лучше
А>Marshal.ReadByte и Marshal.WriteByte
Во-первых, не такие уж они и тормозные. Попробуй целую картинку залить одним цветом только через SetPixel или через ScanLine — результат отличается имхо не сильно. Во-вторых, как пользоваться Marshal.ReadByte — можно пример?
Re[3]: ниче не пойму...
От: Аноним  
Дата: 19.04.04 20:34
Оценка: 7 (2)
Здравствуйте, Rumata, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


Вот пример который изменяет цвета части картинки, в реальном приложении это были части кнопки:
Если использовать здесь GetPixel и SetPixel тормоза были страшные а так все летает))
//рисуем картинку    
public void DrawRes(int r, int g, int b, ref Graphics gr)  
{
        gr.Clip=m_Region; //регион который надо было перерисовать
                
    try
    {
        //если надо изменять картинку
        if ( r!=0 || g!=0 || b!=0 )    
        {
            //получаем rect региона
            RectangleF rectReg = m_Region.GetBounds(gr); 
            //создаем rect равный нужной части картинки
            Rectangle rect = new Rectangle((int)rectReg.X - m_ltx, (int)rectReg.Y - m_lty, 
                                  (int)rectReg.Width, (int)rectReg.Height);
            //создаем временный битмап
            Bitmap tmpBitmap=null;
            tmpBitmap = m_Bitmap.Clone(rect, PixelFormat.Format24bppRgb);
                    
            BitmapData bitdata = null;
            IntPtr pData;
            try
            {
                //получение данных о памяти временного рисунка
                bitdata = tmpBitmap.LockBits(new Rectangle(0,0,rect.Width,rect.Height),
                              ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                //получаем адрес начала фрагмента файла
                pData = bitdata.Scan0;
                //преобразуем данные
                byte c_b;                //составляющая цвета
                int w = bitdata.Width, h = bitdata.Height; 
                int tmp=0, offset=0;    //используются для уменьшения вычислений
                for (int i=0;i<h;i++)
                {
                    for (int k=0;k<w;k++)
                    {    
                        //изменяем значения цветов
                        //синего
                        c_b = Marshal.ReadByte(pData, offset); 
                        tmp = b+(int)(c_b);
                        if (tmp>255) tmp = 255;    if (tmp<0) tmp = 0;
                        Marshal.WriteByte(pData,offset,(byte)(tmp));
                        //зеленого
                        offset++;
                        c_b = Marshal.ReadByte(pData, offset); //указатель
                        tmp = g+(int)(c_b);
                        if (tmp>255) tmp = 255; if (tmp<0) tmp = 0;
                        Marshal.WriteByte(pData,offset,(byte)(tmp));
                        //красного
                        offset++;
                        c_b = Marshal.ReadByte(pData, offset); //указатель
                        tmp = r+(int)(c_b);
                        if (tmp>255) tmp = 255; if (tmp<0) tmp = 0;
                        Marshal.WriteByte(pData,offset,(byte)(tmp));
                        offset++;
                    }
                        //смещение в файле рисунка чтобы попасть на следующую строчку
                    offset = i*bitdata.Stride;
                }
            }
            finally
            {
                       if (bitdata !=null) tmpBitmap.UnlockBits(bitdata);    //освобождаем рисунок
            }
            //рисуем временный рисунок
            gr.DrawImage(tmpBitmap,rect.X+m_ltx,rect.Y+m_lty,tmpBitmap.Width,tmpBitmap.Height);
        }
        //рисуем обычный рисунок
        else gr.DrawImage(m_Bitmap,m_ltx,m_lty,m_Bitmap.Width,m_Bitmap.Height);
    }
    catch (Exception ex) {MessageBox.Show("Ошибка при выводе рисунка\nОписание:\n"+ex);}
}
Re[4]: ниче не пойму...
От: Sasha_ill  
Дата: 19.04.04 20:41
Оценка:
забыл сказать, что m_lty и m_ltx — координаты верхнего угла кнопки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.