Здравствуйте, 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);}
}