C# 圖像處理,改變圖標的顏色,指針


大家設想一種情況,我們拿到了一張素材,我們將它作為我們軟件中的圖標,為了給用戶更好的體驗,鼠標移動上去和按下去,都需要出現不同的效果,卻不想在資源文件中添加多張圖片,那么怎么辦呢?

這里小白給大家分享一種可行,並且高效的方式。老規矩話不多說,先看效果,有興趣再繼續閱讀。

 

 看到了效果圖是不是一下子就想到了實現的原理,沒錯,正如你所想,遍歷像素,改變像素值就可以了。

需要注意的是,這里我用的是png帶透明度的圖片,所以它是32位 4 通道的圖片,我下面貼的代碼也不適用於3通道的BGR 圖片,如果您有其它需求,就自己改一下吧,又不復雜。另外為了處理圖片的高效,我們就不采用GDI+的setPixel方法了,直接操作內存地址,速度肯定是成倍數的增長的。不多BB,先上代碼:

public static partial class BitmapEx
    {
        public static Bitmap ChangeColor(this Bitmap originalBmp, Color color)
        {
            Bitmap bmp = originalBmp.Clone() as Bitmap;//創建一個副本
            unsafe
            {
                Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                BitmapData bmpdata = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);//鎖定到內存
                byte A;//Alpha
                unsafe
                {
                    byte* ptr = (byte*)(bmpdata.Scan0);//得到起始指針
                    for (int x = 0; x < bmpdata.Width; x++)
                    {
                        for (int y = 0; y < bmpdata.Height; y++)
                        {
                            A = ptr[3];
                            ptr[0] = color.B;
                            ptr[1] = color.G;
                            ptr[2] = color.R;
                            ptr[3] = ptr[3];
                            ptr += 4;
                        }
                        ptr += bmpdata.Stride - bmpdata.Width * 4;
                    }
                }
                bmp.UnlockBits(bmpdata);
            }
            return bmp;
        }
    }

  代碼是不是很精簡呢,應用這個代碼也很簡單,為了方便演示,我上面的效果是直接用的PicBox哈。實例代碼也一並貼上吧,簡單到爆:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            pictureBox1.MouseEnter += PictureBox1_MouseEnter;
            pictureBox1.MouseLeave += PictureBox1_MouseLeave;
            pictureBox2.MouseEnter += PictureBox1_MouseEnter;
            pictureBox2.MouseLeave += PictureBox1_MouseLeave;
            pictureBox3.MouseEnter += PictureBox1_MouseEnter;
            pictureBox3.MouseLeave += PictureBox1_MouseLeave;
        }

        private void PictureBox1_MouseLeave(object sender, EventArgs e)
        {
            (sender as PictureBox).Image = new Bitmap((sender as PictureBox).Image).ChangeColor(Color.Black);
        }

        private void PictureBox1_MouseEnter(object sender, EventArgs e)
        {
            (sender as PictureBox).Image = new Bitmap((sender as PictureBox).Image).ChangeColor(Color.Red);
        }
    }

當然這種方式適合的場合並不是特別的多,但也是一種不錯的方法,稍加更改可以實現各種效果,比如用255減去當前的像素值,是不是整個圖片就會變成一種反色式的圖呢?我這里就不做演示了,想要實現各種效果的朋友們就自己去拓展吧。題外話,建議各位多用用partial和 拓展方法哦。這里是采用的拓展方法的方式,比較方便呢。

OK 不說了,該去做飯了 88。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM