当前位置:  开发笔记 > 编程语言 > 正文

在没有外部dll的情况下制作负面图像的有效方法

如何解决《在没有外部dll的情况下制作负面图像的有效方法》经验,为你挑选了1个好方法。

这是一个解决方案,使C#Windows窗体中的图像没有任何dll并以有效,快速的方式产生负面影响?



1> Kris Erickso..:

最好的方法是使用位图数据直接访问像素.

只是添加一些时间细节:

对800万像素图像执行取消(在2.4 Ghz Core 2 Duo上):

SetPixel(~22秒) - 慢220倍

Color Matrix,Matajon的方法如下(~750毫秒) - 慢7倍

直接访问位图数据(~100毫秒) - 最快

因此,如果您不能使用不安全的代码,那么Color Matrix比SetPixel好得多.

    public static void Negate(Bitmap image)
    {
        const int RED_PIXEL = 2;
        const int GREEN_PIXEL = 1;
        const int BLUE_PIXEL = 0;


        BitmapData bmData = currentImage.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, image.PixelFormat);

        try
        {
            int stride = bmData.Stride;
            int bytesPerPixel = (currentImage.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4);

            unsafe
            {
                byte* pixel = (byte*)(void*)bmData.Scan0;
                int yMax = image.Height;
                int xMax = image.Width;

                for (int y = 0; y < yMax; y++)
                {
                    int yPos = y * stride;
                    for (int x = areaSize.X; x < xMax; x++)
                    {
                        int pos = yPos + (x * bytesPerPixel);

                        pixel[pos + RED_PIXEL] = (byte)(255 - pixel[pos + RED_PIXEL]);
                        pixel[pos + GREEN_PIXEL] = (byte)(255 - pixel[pos + GREEN_PIXEL]);
                        pixel[pos + BLUE_PIXEL] = (byte)(255 - pixel[pos + BLUE_PIXEL]);                                                    
                    }

                }
            }
        }
        finally
        {
            image.UnlockBits(bmData);
        }

    }

如果您有兴趣,这里是Color Matrix的代码:

    public static void Negate(Bitmap image)
    {

            Bitmap clone = (Bitmap) image.Clone();

            using (Graphics g = Graphics.FromImage(image))
            {

                // negation ColorMatrix
                ColorMatrix colorMatrix = new ColorMatrix(
                    new float[][]
                        {
                            new float[] {-1, 0, 0, 0, 0},
                            new float[] {0, -1, 0, 0, 0},
                            new float[] {0, 0, -1, 0, 0},
                            new float[] {0, 0, 0, 1, 0},
                            new float[] {0, 0, 0, 0, 1}
                        });

                ImageAttributes attributes = new ImageAttributes();

                attributes.SetColorMatrix(colorMatrix);

                g.DrawImage(clone, new Rectangle(0, 0, clone.Width, clone.Height),
                            0, 0, clone.Width, clone.Height, GraphicsUnit.Pixel, attributes);
           }
    }


我要补充一点.在我的C++代码中,我使用Bitmap :: ApplyEffect(),这里显示的矩阵产生一个黑色图像,因为负色被钳制为零.适合我的矩阵是:{{-1,0,0,0,0},{0,-1,0,0,0},{0,0,-1,0,0},{0, 0,0,1,0},{1,1,1,0,1}}
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有