Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оттенок и Насыщенность 
:(
    Опции темы
Elfet
  Дата 9.7.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



У меня есть чернобелая картинка, и я хочу изменить её оттенок и насыщенность. (Хочу реализовать плавный переход из красного в зелёный, если быть точнее)
Есть ли какие-нибудь стандартные средства для этого или как это реализовать вручную? 
Заранее спасибо!


--------------------
PM MAIL WWW Skype   Вверх
tol05
Дата 9.7.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



посмотри Color.GetBrightness(), а также
Color.GetHue();
Color.GetSaturation();


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Elfet
  Дата 9.7.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Посмотрел, в примерах там только о том как получить всё KnownColor с тем же оттенком/насыщенность что и заданного цвета. А вот как мне изменить оттенок/насыщенность картинки, не нашёл.


--------------------
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 9.7.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



На вики есть инфа по связи между HSB и RGB. А для начала пойдёт и этот пример:
http://www.codeproject.com/cs/media/HSLColorSpace.asp


--------------------
user posted image
PM MAIL WWW   Вверх
Elfet
Дата 10.7.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Угу, на кодепроджекте всё есть. Только вот не пойму зачем unsafe код используетя? Без него никак не обойтись?
Код

        public static Bitmap Hue(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;

            Rectangle rc = new Rectangle(0, 0, width, height);

            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);

            Bitmap dest = new Bitmap(width, height, source.PixelFormat);

            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int offset = dataSrc.Stride - (width*3);

            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;

                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Hue *= factor;

                        Color c = hsl.RGB;

                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;

                        bytesSrc += 3;
                        bytesDest += 3;
                    }

                    bytesDest += offset;
                    bytesSrc += offset;
                }

                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }


Добавлено через 13 минут и 8 секунд
И этот код не работает с прозрачными png картинками smile


--------------------
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 11.7.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Unsafe - потому что бытсрый, т.к. работает через указатели. Не работает с прозрачностью потому что подразумевает 24-битный цвет. Изменив 35 и 36 строки на +4, и добавив после 33-й аналог для Alpha, можно теоретически решить проблему.


--------------------
user posted image
PM MAIL WWW   Вверх
Elfet
Дата 12.7.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Не-а не помогло. Видимо что-то больше надо изменить:
Код

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace ColorFilters
{
    public class YUV
    {
        public byte Y;
        public byte U;
        public byte V;

        public YUV(byte Y, byte U, byte V)
        {
            this.Y = Y;
            this.U = U;
            this.V = V;
        }

        public static YUV FromRGB(Color c)
        {
            byte Y, U, V;

            Y = (byte)(((  66 * c.R + 129 * c.G +  25 * c.B + 128) >> 8) +  16);
            U = (byte)((( -38 * c.R -  74 * c.G + 112 * c.B + 128) >> 8) + 128);
            V = (byte)((( 112 * c.R -  94 * c.G -  18 * c.B + 128) >> 8) + 128);
            
            return new YUV(Y,U,V);
        }

        public Color RGB
        {
            get
            {
                int C = Y - 16;
                int D = U - 128;
                int E = V - 128;

                byte R, G, B;

                R = (byte)Math.Max(Math.Min((( 298 * C           + 409 * E + 128) >> 8), 255), 0);
                G = (byte)Math.Max(Math.Min((( 298 * C - 100 * D - 208 * E + 128) >> 8), 255), 0);
                B = (byte)Math.Max(Math.Min((( 298 * C + 516 * D           + 128) >> 8), 255), 0);

                return Color.FromArgb(R,G,B);
            }
        }
    }

    public class HSL
    {
        private float h;
        private float s;
        private float l;

        public float Hue
        {
            get
            {
                return h;
            }
            set
            {
                h = (float)(Math.Abs(value)%360);
            }
        }

        public float Saturation
        {
            get
            {
                return s;
            }
            set
            {
                s = (float)Math.Max(Math.Min(1.0, value), 0.0);
            }
        }

        public float Luminance
        {
            get
            {
                return l;
            }
            set
            {
                l = (float)Math.Max(Math.Min(1.0, value), 0.0);
            }
        }

        private HSL()
        {
        }
        public HSL(float hue, float saturation, float luminance)
        {
            Hue = hue;
            Saturation = saturation;
            Luminance = luminance;
        }


        public Color RGB
        {
            get
            {
                double r=0,g=0,b=0; 

                double temp1,temp2; 

                double normalisedH = h/360.0;

                if(l==0) 
                { 
                    r=g=b=0; 
                } 
                else 
                { 
                    if(s==0) 
                    { 
                        r=g=b=l; 
                    } 
                    else 
                    { 
                        temp2 = ((l<=0.5) ? l*(1.0+s) : l+s-(l*s)); 

                        temp1 = 2.0*l-temp2; 

                      double[] t3=new double[]{normalisedH+1.0/3.0,normalisedH,normalisedH-1.0/3.0}; 

                        double[] clr=new double[]{0,0,0}; 

                        for(int i=0;i<3;++i) 
                        { 
                            if(t3[i]<0) 
                                t3[i]+=1.0; 

                            if(t3[i]>1) 
                                t3[i]-=1.0; 

                            if(6.0*t3[i] < 1.0) 
                                clr[i]=temp1+(temp2-temp1)*t3[i]*6.0; 
                            else if(2.0*t3[i] < 1.0) 
                                clr[i]=temp2; 
                            else if(3.0*t3[i] < 2.0) 
                                clr[i]=(temp1+(temp2-temp1)*((2.0/3.0)-t3[i])*6.0); 
                            else 
                                clr[i]=temp1; 

                        } 

                        r=clr[0]; 
                        g=clr[1]; 
                        b=clr[2]; 
                    } 

                } 
                return Color.FromArgb((int)(255*r),(int)(255*g),(int)(255*b)); 
            }
        }

        private static byte toRGB(float rm1, float rm2, float rh)
        {
            if(rh>360) rh-=360;
            else if(rh<  0) rh+=360;

            if(rh< 60) rm1=rm1+(rm2-rm1)*rh/60;   
            else if(rh<180) rm1=rm2;
            else if(rh<240) rm1=rm1+(rm2-rm1)*(240-rh)/60;      

            return (byte)(rm1*255);
        }


        public static HSL FromRGB(byte red, byte green, byte blue)
        {
            return FromRGB(Color.FromArgb(red, green, blue));
        }

        public static HSL FromRGB(Color c)
        {
            return new HSL(c.GetHue(), c.GetSaturation(), c.GetBrightness());
        }
    }

    /// <summary>
    /// Summary description for ColorSpace.
    /// </summary>
    public class ColorSpace
    {
        public ColorSpace()
        {
        }

        public static Bitmap Luminance(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;

            Rectangle rc = new Rectangle(0, 0, width, height);

            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);

            Bitmap dest = new Bitmap(width, height, source.PixelFormat);

            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int offset = dataSrc.Stride - (width*3);

            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;

                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Luminance *= factor;

                        Color c = hsl.RGB;

                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;

                        bytesSrc += 3;
                        bytesDest += 3;
                    }

                    bytesDest += offset;
                    bytesSrc += offset;
                }

                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }

        public static Bitmap Hue(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;

            Rectangle rc = new Rectangle(0, 0, width, height);

            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);

            Bitmap dest = new Bitmap(width, height, source.PixelFormat);

            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int offset = dataSrc.Stride - (width*3);

            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;

                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Hue *= factor;

                        Color c = hsl.RGB;

                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;
                        bytesDest[3] = c.A;

                        bytesSrc += 4;
                        bytesDest += 4;
                    }

                    bytesDest += offset;
                    bytesSrc += offset;
                }

                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }

        public static Bitmap Saturation(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;

            Rectangle rc = new Rectangle(0, 0, width, height);

            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);

            Bitmap dest = new Bitmap(width, height, source.PixelFormat);

            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int offset = dataSrc.Stride - (width*3);

            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;

                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Saturation *= factor;

                        Color c = hsl.RGB;

                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;

                        bytesSrc += 3;
                        bytesDest += 3;
                    }

                    bytesDest += offset;
                    bytesSrc += offset;
                }

                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }
    }
}




--------------------
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 12.7.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



В методах Luminance и Saturation надо так же сдвигать на 4 (а не на 3!), как в методе Hue.


--------------------
user posted image
PM MAIL WWW   Вверх
Elfet
Дата 12.7.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Угу, но это не помогает. Я пробовал ещё в класс HSL добавить 4-ты параметр alpha - но видимо что-то в самой функции нужно изменить.
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 12.7.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Стоп, 4 байта не нужно, картинки обе в 24bpp судя по исходнику.


--------------------
user posted image
PM MAIL WWW   Вверх
Elfet
Дата 12.7.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Код

using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace ColorFilters
{
    public class YUV
    {
        public byte Y;
        public byte U;
        public byte V;
        public YUV(byte Y, byte U, byte V)
        {
            this.Y = Y;
            this.U = U;
            this.V = V;
        }
        public static YUV FromRGB(Color c)
        {
            byte Y, U, V;
            Y = (byte)(((  66 * c.R + 129 * c.G +  25 * c.B + 128) >> 8) +  16);
            U = (byte)((( -38 * c.R -  74 * c.G + 112 * c.B + 128) >> 8) + 128);
            V = (byte)((( 112 * c.R -  94 * c.G -  18 * c.B + 128) >> 8) + 128);
            
            return new YUV(Y,U,V);
        }
        public Color RGB
        {
            get
            {
                int C = Y - 16;
                int D = U - 128;
                int E = V - 128;
                byte R, G, B;
                R = (byte)Math.Max(Math.Min((( 298 * C           + 409 * E + 128) >> 8), 255), 0);
                G = (byte)Math.Max(Math.Min((( 298 * C - 100 * D - 208 * E + 128) >> 8), 255), 0);
                B = (byte)Math.Max(Math.Min((( 298 * C + 516 * D           + 128) >> 8), 255), 0);
                return Color.FromArgb(R,G,B);
            }
        }
    }
    public class HSL
    {
        private float h;
        private float s;
        private float l;
        public float Hue
        {
            get
            {
                return h;
            }
            set
            {
                h = (float)(Math.Abs(value)%360);
            }
        }
        public float Saturation
        {
            get
            {
                return s;
            }
            set
            {
                s = (float)Math.Max(Math.Min(1.0, value), 0.0);
            }
        }
        public float Luminance
        {
            get
            {
                return l;
            }
            set
            {
                l = (float)Math.Max(Math.Min(1.0, value), 0.0);
            }
        }
        private HSL()
        {
        }
        public HSL(float hue, float saturation, float luminance)
        {
            Hue = hue;
            Saturation = saturation;
            Luminance = luminance;
        }
        public Color RGB
        {
            get
            {
                double r=0,g=0,b=0; 
                double temp1,temp2; 
                double normalisedH = h/360.0;
                if(l==0) 
                { 
                    r=g=b=0; 
                } 
                else 
                { 
                    if(s==0) 
                    { 
                        r=g=b=l; 
                    } 
                    else 
                    { 
                        temp2 = ((l<=0.5) ? l*(1.0+s) : l+s-(l*s)); 
                        temp1 = 2.0*l-temp2; 
                      double[] t3=new double[]{normalisedH+1.0/3.0,normalisedH,normalisedH-1.0/3.0}; 
                        double[] clr=new double[]{0,0,0}; 
                        for(int i=0;i<3;++i) 
                        { 
                            if(t3[i]<0) 
                                t3[i]+=1.0; 
                            if(t3[i]>1) 
                                t3[i]-=1.0; 
                            if(6.0*t3[i] < 1.0) 
                                clr[i]=temp1+(temp2-temp1)*t3[i]*6.0; 
                            else if(2.0*t3[i] < 1.0) 
                                clr[i]=temp2; 
                            else if(3.0*t3[i] < 2.0) 
                                clr[i]=(temp1+(temp2-temp1)*((2.0/3.0)-t3[i])*6.0); 
                            else 
                                clr[i]=temp1; 
                        } 
                        r=clr[0]; 
                        g=clr[1]; 
                        b=clr[2]; 
                    } 
                } 
                return Color.FromArgb((int)(255*r),(int)(255*g),(int)(255*b)); 
            }
        }
        private static byte toRGB(float rm1, float rm2, float rh)
        {
            if(rh>360) rh-=360;
            else if(rh<  0) rh+=360;
            if(rh< 60) rm1=rm1+(rm2-rm1)*rh/60;   
            else if(rh<180) rm1=rm2;
            else if(rh<240) rm1=rm1+(rm2-rm1)*(240-rh)/60;      
            return (byte)(rm1*255);
        }
        public static HSL FromRGB(byte red, byte green, byte blue)
        {
            return FromRGB(Color.FromArgb(red, green, blue));
        }
        public static HSL FromRGB(Color c)
        {
            return new HSL(c.GetHue(), c.GetSaturation(), c.GetBrightness());
        }
    }
    /// <summary>
    /// Summary description for ColorSpace.
    /// </summary>
    public class ColorSpace
    {
        public ColorSpace()
        {
        }
        public static Bitmap Luminance(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;
            Rectangle rc = new Rectangle(0, 0, width, height);
            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);
            Bitmap dest = new Bitmap(width, height, source.PixelFormat);
            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int offset = dataSrc.Stride - (width*3);
            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;
                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Luminance *= factor;
                        Color c = hsl.RGB;
                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;
                        bytesSrc += 3;
                        bytesDest += 3;
                    }
                    bytesDest += offset;
                    bytesSrc += offset;
                }
                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }
        public static Bitmap Hue(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;
            Rectangle rc = new Rectangle(0, 0, width, height);
            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);
            Bitmap dest = new Bitmap(width, height, source.PixelFormat);
            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int offset = dataSrc.Stride - (width*3);
            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;
                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Hue *= factor;
                        Color c = hsl.RGB;
                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;
                        bytesDest[3] = c.A;
                        bytesSrc += 4;
                        bytesDest += 4;
                    }
                    bytesDest += offset;
                    bytesSrc += offset;
                }
                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }
        public static Bitmap Saturation(Bitmap source, float factor)
        {
            int width = source.Width;
            int height = source.Height;
            Rectangle rc = new Rectangle(0, 0, width, height);
            if (source.PixelFormat != PixelFormat.Format24bppRgb) source = source.Clone(rc, PixelFormat.Format24bppRgb);
            Bitmap dest = new Bitmap(width, height, source.PixelFormat);
            BitmapData dataSrc = source.LockBits(rc, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataDest = dest.LockBits(rc, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int offset = dataSrc.Stride - (width*3);
            unsafe
            {
                byte * bytesSrc = (byte *)(void *)dataSrc.Scan0;
                byte * bytesDest = (byte *)(void *)dataDest.Scan0;
                for (int y = 0; y < height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        HSL hsl = HSL.FromRGB(bytesSrc[2], bytesSrc[1], bytesSrc[0]); // Still BGR
                        hsl.Saturation *= factor;
                        Color c = hsl.RGB;
                        bytesDest[0] = c.B;
                        bytesDest[1] = c.G;
                        bytesDest[2] = c.R;
                        bytesSrc += 3;
                        bytesDest += 3;
                    }
                    bytesDest += offset;
                    bytesSrc += offset;
                }
                source.UnlockBits(dataSrc);
                dest.UnlockBits(dataDest);
            }
    
            return dest;
        }
    }
}



--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.