c# - 更改图像的颜色

标签 c# c#-4.0

我有一系列包含一种原色的图标。例如,我有一颗黄色的星星,其透明背景已消除锯齿。

有没有办法改变色调或饱和度来将图像改为紫色?

我使用的是 C# 4.0,我不关心解决方案是 GDI+ 还是 WPF。我一直在使用 System.Drawing.Image 读取文件,但我不一定需要继续这样做。图片相对较小,小于 100x100,我希望颜色是动态的,所以仅仅编辑图片本身来制作一堆副本并不是真正的解决方案。

有 ColorMatrix 类,但我不确定如何使用它从一种颜色转换为另一种颜色。使 rgb 值不同看起来相当容易,但我如何在颜色之间进行转换?

最佳答案

点击此链接可获得有关使用 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# 的。通过对算法的基本了解,您应该能够将其应用于此代码。

关于c# - 更改图像的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8949968/

相关文章:

asp.net - 在 asp.net 中动态添加多个系列到图表

c# - 如何在 PDF 文件的文件属性的详细信息选项卡中添加关键字

c# - 如何在本地测试 Azure 队列触发器函数?

c# - 如何导航到同一解决方案中的另一个项目

c# - 绑定(bind)泛型方法委托(delegate)时出错 - 签名或安全透明度

c# - 任务完成后如何调用过程

c# - C# 扩展方法中 "this"参数的默认值

c# - 如何在 WinForms 中创建线程?

c# - 将延迟的 IEnumerable<T> 拆分为两个序列而不重新评估?

c# - 亚马逊 MWS API :Retrieve multiple Images uploaded by Seller c#