Здравствуйте, Closer, Вы писали:
C>Здравствуйте, GePo, Вы писали:
GP>>Пусть я, например, хочу свести изображение к градациям серого.
C>Попробуй использовать класс System.Drawing.Drawing2D.LinearGradientBrush
C>
Если я правильно понял, то это вы предлагаете по другому свести к градациям. Мне такой вариант не подходит, потому что мне надо будет реализовывать различные фильтры. Если я не правильно понял, то можете по конкретнее пример написать, т.к. я еще плохо дружу с .NET
Здравствуйте, GePo, Вы писали:
GP>Если я правильно понял, то это вы предлагаете по другому свести к градациям. Мне такой вариант не подходит, потому что мне надо будет реализовывать различные фильтры. Если я не правильно понял, то можете по конкретнее пример написать, т.к. я еще плохо дружу с .NET
Да, вроде у проблема в цветах, т.к. используя GetPixel/SetPixel все фильтры работают правильно — но медленно. Хотелось бы быстро, как я делал, только вот как правильно работать с цветами — непонятно.
C>>Сори, не внимательно прочитал вопрос. Посмотри как сделано здесь http://www.bobpowell.net/grayscale.htm
GP>Да, вроде у проблема в цветах, т.к. используя GetPixel/SetPixel все фильтры работают правильно — но медленно. Хотелось бы быстро, как я делал, только вот как правильно работать с цветами — непонятно.
А второй алгоритм который там описан чем тебе не устраивает? Вроде написано что он быстро работает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Мы были здесь. Но пора идти дальше. (с) Дуглас Коупленд, Рабы "Микрософт"
C>>Сори, не внимательно прочитал вопрос. Посмотри как сделано здесь http://www.bobpowell.net/grayscale.htm
GP>Да, вроде у проблема в цветах, т.к. используя GetPixel/SetPixel все фильтры работают правильно — но медленно. Хотелось бы быстро, как я делал, только вот как правильно работать с цветами — непонятно.
public static Bitmap RGBToGrey(Bitmap picture, ProcessingType type)
{
Bitmap pic = (Bitmap)picture.Clone();
int pictureWidth = pic.Width;
switch (type)
{
case ProcessingType.Matrix:
Graphics g = Graphics.FromImage(pic);
float[][] greyArray =
{
new float[] {0.299f, 0.299f, 0.299f, 0, 0},
new float[] {0.587f, 0.587f, 0.587f, 0, 0},
new float[] {0.114f, 0.114f, 0.114f, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 1, 1}
};
ColorMatrix greyMatrix = new ColorMatrix(greyArray);
ImageAttributes greyAttributes = new ImageAttributes();
greyAttributes.SetColorMatrix(greyMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
Rectangle picRectangle = new Rectangle(0, 0, pic.Width, pic.Height);
g.DrawImage(pic, picRectangle, 0, 0, pic.Width, pic.Height, GraphicsUnit.Pixel, greyAttributes);
break;
case ProcessingType.PerPixel:
Color pixelColor;
byte byteGrey = 0;
int intGrey = 0;
for (int y = 0; y < pic.Height; y++)
{
for (int x = 0; x < pictureWidth; x++)
{
pixelColor = pic.GetPixel(x, y);
intGrey = (int)(0.299 * pixelColor.R + 0.587 * pixelColor.G + 0.144 * pixelColor.B);
if (intGrey > 255)
byteGrey = 255;
else
byteGrey = (byte)intGrey;
pic.SetPixel(x, y, Color.FromArgb(byteGrey, byteGrey, byteGrey));
}
}
break;
case ProcessingType.PerPixelUnsafe:
BitmapData bmData = pic.LockBits(new Rectangle(0, 0, pic.Width, pic.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr scan = bmData.Scan0;
unsafe
{
byte* p = (byte*)scan;
byte red;
byte green;
byte blue;
for (int y = 0; y < pic.Height; y++)
{
for (int x = 0; x < pictureWidth; x++)
{
blue = p[0];
green = p[1];
red = p[2];
p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
p += 3;
}
}
}
pic.UnlockBits(bmData);
break;
}
return pic;
}