Изменение цвета изображения - PullRequest
1 голос
/ 21 января 2012

У меня есть серия значков, которые содержат 1 основной цвет.Например, у меня есть желтая звезда с прозрачным фоном с сглаживанием.

Есть ли способ изменить оттенок или насыщенность, чтобы вместо изображения было фиолетовым?

Я использую C # 4.0, мне все равно, будет ли решение GDI + или WPF.Я использовал System.Drawing.Image для чтения файла, но мне не обязательно продолжать это делать.Изображения относительно малы, менее 100x100, и я хочу, чтобы цвет был динамичным, поэтому простое редактирование самого изображения для получения нескольких копий на самом деле не является решением.

Существует класс ColorMatrix, но яне знаете, как конвертировать из одного цвета в другой, используя его.Выглядит довольно просто, просто изменив значения rgb, но как я могу конвертировать между цветами?

Ответы [ 2 ]

2 голосов
/ 21 января 2012

world map

Я использовал этот код, чтобы изменить все цвета океана и моря ... Может быть, это немного дольше, но я думаю, что это поможет вам ...

Сначала я получаю все пиксели в списке Нокталар

List<Nokta> noktalar = new List<Nokta>();


Bitmap bm = new Bitmap(pictureBox1.Image);
for (int i = 0; i < pictureBox1.Height; i++)
{
     for (int j = 0; j < pictureBox1.Width; j++)
     {
          Color col = bm.GetPixel(j, i);
          Nokta n = new Nokta();
          n.point.X = j;
          n.point.Y = i;
          n.renk = col;
          noktalar.Add(n);
     }
}

И Нокта Класс:

public class Nokta
{
    public Point point;
    public Color renk;        
}


deniz=noktalar.FindAll(FindDeniz);


private static bool FindDeniz(Nokta n)
{
    if (n.renk.Name == "ff000080")
    {
        return true;
    }
    else
    {
        return false;
    }
}

И, наконец, изменить цвет ...

public void changeDenizColor(Color c)
{
     Bitmap bitmap = new Bitmap(pictureBox1.Image);
     foreach (Nokta n in deniz)
     {
         n.renk = c;
         bitmap.SetPixel(n.point.X, n.point.Y, c);
         pictureBox1.Image = bitmap;
     }
}
2 голосов
/ 21 января 2012

Перейдите по этой ссылке, чтобы получить удивительное руководство по обработке изображений в C #. Если вы просматриваете пользователя, который его отправил, вы можете найти все 6 частей руководства.

http://www.codeproject.com/Articles/1989/Image-Processing-for-Dummies-with-C-and-GDI-Part-1

В руководстве показано, как использовать небезопасный код для доступа к данным изображения. Я предпочитаю хранить код в безопасности и использовать альтернативный метод следующим образом:

        Bitmap b = new Bitmap(img1);
        BitmapData bitmapData = b.LockBits(
            new Rectangle(0, 0, b.Width, b.Height),
            ImageLockMode.ReadWrite,
            PixelFormat.Format24bppRgb
        );

        int numPixels = b.Width * b.Height;
        byte[] pixels = new byte[numPixels * 3]; // 3 bytes per pixel

        Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length);

        // Use this method to apply an effect to each pixel individually
        for (int i = 0; i < pixels.Length; i++)
        {
            byte value = pixels[i];
            // modify value
            pixels[i] = value;
        }

        // Use this method to apply an effect that considers RGB relationship
        byte red, green, blue;

        for (int i = 0; i < pixels.Length; i += 3)
        {
            blue = pixels[i];
            green = pixels[i + 1];
            red = pixels[i + 2];

            // modify values

            pixels[i] = blue;
            pixels[i + 1] = green;
            pixels[i + 2] = red;
        }

        Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length);

        b.UnlockBits(bitmapData);

Каждый метод обработки изображений не зависит от C #. Имея базовое понимание алгоритмов, вы сможете применять его с этим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...