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);}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.