C#使用不安全代码调整图像透明度

程一诺
程一诺
发布时间:2026-10-13| 6人浏览过
原创

在使用C#进行图形开发时,经常需要调整图像的透明度(Alpha通道)。通过`System.Drawing`命名空间结合不安全的指针操作,可以快速遍历并修改`Bitmap`的像素数据。

C#图像透明度调整方法

在处理位图(Bitmap)时,如果需要改变整体或部分图像的透明度,可以通过修改每个像素的Alpha分量来实现。以下是一个完整的函数实现,使用了`unsafe`关键字直接操作内存中的像素字节流,这种方式在处理高分辨率图像时具有较高的效率。

核心实现步骤

  1. 定义图像处理上下文:创建一个与源图像尺寸相同的、支持32位ARGB格式的`Bitmap`对象作为输出画布。
  2. 锁定图像数据:分别对源图像和目标图像调用`LockBits`方法,获取指向图像底层数据的指针,这避免了在循环中使用低效的`GetPixel`/`SetPixel`方法。
  3. 逐行扫描像素:利用嵌套循环遍历每一个像素,读取其RGB颜色值,并将指定的透明度值赋值给Alpha通道(在32位ARGB格式中通常位于第3个字节位置)。
  4. 释放资源:遍历完成后,必须调用`UnlockBits`方法将内存中的数据写回文件并保持内存一致性。

关键代码解析

以下是具体的C#实现代码:

// 定义图像透明度调整函数
public Bitmap PTransparentAdjust(Bitmap src, int num)
{
    try
    {
        int w = src.Width;
        int h = src.Height;
        // 创建一个新的Bitmap,使用Format32bppArgb格式以支持透明度通道
        Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        
        // 锁定源图像和目标图像的像素数据
        System.Drawing.Imaging.BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        
        unsafe
        {
            byte* pIn = (byte*)srcData.Scan0.ToPointer();
            byte* pOut = (byte*)dstData.Scan0.ToPointer();
            byte* p;
            int stride = srcData.Stride;
            int r, g, b;
            
            for (int y = 0; y < h; y++)
            {
                for (int x = 0; x < w; x++)
                {
                    p = pIn;
                    b = pIn[0]; // Blue通道
                    g = pIn[1]; // Green通道
                    r = pIn[2]; // Red通道
                    
                    pOut[1] = (byte)g; // 写入绿色
                    pOut[2] = (byte)r; // 写入红色
                    pOut[3] = (byte)num; // 写入指定的透明度(num通常在0-255之间)
                    pOut[0] = (byte)b; // 写入蓝色
                    
                    pIn += 4; // 移动指针到下一个像素
                    pOut += 4;
                }
                // 跳过每行末尾可能存在的填充字节
                pIn += srcData.Stride - w * 4;
                pOut += srcData.Stride - w * 4;
            }
            src.UnlockBits(srcData); // 解锁源数据
            dstBitmap.UnlockBits(dstData); // 解锁目标数据
            return dstBitmap;
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message.ToString());
        return null;
    }
}

在上述代码中,`num`参数代表新的透明度值。对于`Format32bppArgb`格式,一个像素占用4个字节,顺序依次为:蓝(B)、绿(G)、红(R)、Alpha(A)。因此,我们需要将`num`的值赋给数组索引为`3`的位置。

此外,`stride`(步幅)属性用于处理图像每行末尾可能存在的内存对齐填充字节。由于我们使用了指针操作,必须在内层循环结束后手动调整指针偏移量,以确保正确地移动到下一行的起始地址。

效果图展示

应用此方法处理后,原始图像的像素将被重新生成。例如,当输入透明度参数为特定百分比对应的数值时,输出的位图将呈现出相应的半透明或全透效果。

原图:

效果图(50%):

希望上述关于C#中调整图像透明度的方法能解决您在开发过程中遇到的问题。如果在实际运行中出现异常,请确保您的项目已启用“允许不安全代码”编译选项。

以上就是C#图像透明度调整的详细内容,更多关于C#编程优化的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。