Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.51.241] |
|
Сообщ.
#1
,
|
|
|
Добрый вечер.
Интересно бы было узнать, есть ли в ГДИ+ фича такая: Допустим у меня есть шарик-картинка Image img=new Bitmap("sharik.png") Поля вокруг шарика прозрачны. Цвет допустим синий и идут градации синего цвета к центру всё светлее. Вопрос такой, можно ли с помощью ГДИ+ поменять эту градацию?Например все синие оттенки в красные? В какую сторону копать? Я думаю будет интересно не только мне. Пример бы очень помог. Спасибо за любую информацию. |
Сообщ.
#2
,
|
|
|
Вот, покопался, с kl пообщался. Есть такая фича, называется она ColorMatrix. Правда закопался я со значениями. Нужно изменять цвет в соответствии с бэкграундом приложения. Если кто может разьяснить как получить эти значения, отпишите, а я дальше копаться в МСДН:)
|
Сообщ.
#3
,
|
|
|
Один еще вопрос в догонку.
Как применить ImageAttributes на картинку её не выводя? Тоесть сразу сохранять в файл или другой битмап? (может туплю и не вижу элементарной вещи... запарился уже просто) Спасибо за любую инфу. Спокойной ночи. |
Сообщ.
#4
,
|
|
|
Вот, покапался и нашёл кое-что на просторах инета, правда unsafe code но работает. Чуть переделал, чтобы прозрачность поддерживал.
<br>public static bool Gamma(Bitmap b, double red, double green, double blue)<br>{<br>[color=Green]//обьясню малёк код, если ктото не понял.<br>//в функцию передаются значения от 0.2 до 5, если все 1, то изображение<br>// не изменится, чем больше это значение, тем светлее цвет.[/color]<br> if (red < .2 || red > 5) return false;<br> if (green < .2 || green > 5) return false;<br> if (blue < .2 || blue > 5) return false;<br>[color=Green] //тут наверное всё ясно:)[/color]<br> byte [] redGamma = new byte [256];<br> byte [] greenGamma = new byte [256];<br> byte [] blueGamma = new byte [256];<br><br> for (int i = 0; i< 256; ++i)<br> {<br>[color=Green]<br>// Это формулы изменения гаммы. Могу добавить, для того чтобы отобразить картинку в<br>// градациях серого цвета, то формула для цвета:<br>//red=(red*77+green*150+blue*29+128)/256;<br>//green=red;<br>//blue=red;<br>[/color]<br> redGamma[i] = (byte)Math.Min(255, (int)(( 255.0 * Math.Pow(i/255.0, 1.0/red)) + 0.5));<br> greenGamma[i] = (byte)Math.Min(255, (int)(( 255.0 * Math.Pow(i/255.0, 1.0/green)) + 0.5));<br> blueGamma[i] = (byte)Math.Min(255, (int)(( 255.0 * Math.Pow(i/255.0, 1.0/blue)) + 0.5));<br> }<br>[color=Green]<br>//"локируем" прямоугольник битов, для изменения гаммы, картинка формата 32argb;<br>//насчет форматов:<br>//Для 32ARGB(с прозрачностью),32RGB используем этот цикл (не забываем выствить <br>//PixelFormat правильный!!!<br>//Для 24GB888 Offset=stride-b.Width*3;p+=3;<br>//Для 16RGB посложнее, есть вариант 555 и 565(зеленый цвет "расширен", почему <br>//зеленый? !Вроде! человеческий глаз более чувствителен к этому цвету. С этими <br>//режимами, елси они Вам нужны, пишите, разберемся вместе. Примерно <br>//p=((red>>3)<<11|((green>>2)<<5)|(blue>>3); //565 режим<br>//p=((red>>3)<<10) | ((reen>>3)<<5)|(blue>>3); //555<br>//p+=2; //в обоих случаях.<br>[/color]<br><br>BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);<br> int stride = bmData.Stride;<br> System.IntPtr Scan0 = bmData.Scan0;<br><br> unsafe<br> {<br> byte * p = (byte *)(void *)Scan0;<br> int nOffset = stride - b.Width*4;<br> for(int y=0;y<b.Height;++y)<br> {<br> for(int x=0; x < b.Width; ++x )<br> {<br> p[2] = redGamma[ p[2] ];<br> p[1] = greenGamma[ p[1] ];<br> p[0] = blueGamma[ p[0] ];<br> p += 4;<br> }<br> p += nOffset;<br> }<br> }<br> b.UnlockBits(bmData);<br> return true;<br> }<br> Вот оно, какое чудо. Но всетаки хотелось бы разобраться с ColorMatrix и ImageAttributes. Стандартные средства кажутся лучше, только не могу разобраться как применять атрибуты к битмапу не выводя ее а сохранить в другой битмап. Есть идеи? Поможите:) П.С. - Если в моих пояснениях есть ошибки, испраьте, хотя на первый взгляд правильно ??? |