с графикой. Точнее "что от чего зависит".
Может кто мне растолкует
пример №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
Здравствуйте, oRover, Вы писали:
R>с графикой. Точнее "что от чего зависит". R>Может кто мне растолкует
Могу добавить свои наблюдегния:
Если грузить картинку (битмап) из файла через конструктор битмапа, то получается 24 битный rgb формат, а если через конструктор Image — то 32 битный Argb
Здравствуйте, 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;
Здравствуйте, 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
Здравствуйте, Аноним, Вы писали:
А>У меня такая же хрень была, по-моему решал также, т.е. клоны создавал А>Только операции GetPixel и SetPixel очень тормозные, попробуй лучше А>Marshal.ReadByte и Marshal.WriteByte
Во-первых, не такие уж они и тормозные. Попробуй целую картинку залить одним цветом только через SetPixel или через ScanLine — результат отличается имхо не сильно. Во-вторых, как пользоваться Marshal.ReadByte — можно пример?
Здравствуйте, 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);}
}