На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> GDI+ features - обработка картинки.
    Добрый вечер.
    Интересно бы было узнать, есть ли в ГДИ+ фича такая:
    Допустим у меня есть шарик-картинка
    ExpandedWrap disabled
      Image img=new Bitmap("sharik.png")

    Поля вокруг шарика прозрачны. Цвет допустим синий и идут градации синего цвета к центру всё светлее.
    Вопрос такой, можно ли с помощью ГДИ+ поменять эту градацию?Например все синие оттенки в красные?
    В какую сторону копать? Я думаю будет интересно не только мне. Пример бы очень помог.
    Спасибо за любую информацию.
      Вот, покопался, с kl пообщался. Есть такая фича, называется она ColorMatrix. Правда закопался я со значениями. Нужно изменять цвет в соответствии с бэкграундом приложения. Если кто может разьяснить как получить эти значения, отпишите, а я дальше копаться в МСДН:)
        Один еще вопрос в догонку.
        Как применить ImageAttributes на  картинку её не выводя? Тоесть сразу сохранять в файл или другой битмап?
        (может туплю и не вижу элементарной вещи... запарился уже просто)
        Спасибо за любую инфу.
        Спокойной ночи.
          Вот, покапался и нашёл  кое-что на просторах инета, правда unsafe code но работает. Чуть переделал, чтобы прозрачность поддерживал.
          ExpandedWrap disabled
            <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.
          Стандартные средства кажутся лучше, только не могу разобраться как применять атрибуты к битмапу не выводя ее а сохранить в другой битмап. Есть идеи?
          Поможите:)
          П.С. - Если в моих пояснениях есть ошибки, испраьте, хотя на первый взгляд правильно  ???
          Сообщение отредактировано: Technos -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0250 ]   [ 17 queries used ]   [ Generated: 19.04.24, 06:19 GMT ]