.net winform 实现CSS3.0 泼墨画效果

效果图
代码
csharp 复制代码
private unsafe void BlendImages1(Bitmap img1, Bitmap img2)
{
    // 确定两个图像的重叠区域
    Rectangle rect = new Rectangle(0, 0,
        Math.Min(img1.Width, img2.Width),
        Math.Min(img1.Height, img2.Height));

    // 创建输出图像,尺寸为重叠区域大小
    Bitmap blendedImage = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);

    // Lock the bits of each image and get the BitmapData.
    BitmapData data1 = img1.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
    BitmapData data2 = img2.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
    BitmapData dataBlended = blendedImage.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

    int bytesPerPixel = 4; // For Format32bppArgb
    int stride1 = data1.Stride;
    int stride2 = data2.Stride;
    int strideBlended = dataBlended.Stride;

    byte* ptr1 = (byte*)data1.Scan0.ToPointer();
    byte* ptr2 = (byte*)data2.Scan0.ToPointer();
    byte* ptrBlended = (byte*)dataBlended.Scan0.ToPointer();

    for (int y = 0; y < rect.Height; ++y)
    {
        byte* rowPtr1 = ptr1 + y * stride1;
        byte* rowPtr2 = ptr2 + y * stride2;
        byte* rowPtrBlended = ptrBlended + y * strideBlended;

        for (int x = 0; x < rect.Width; ++x)
        {
            int pixelOffset = x * bytesPerPixel;
            if (pixelOffset + bytesPerPixel <= Math.Abs(stride1) &&
                pixelOffset + bytesPerPixel <= Math.Abs(stride2) &&
                pixelOffset + bytesPerPixel <= Math.Abs(strideBlended))
            {
                rowPtrBlended[pixelOffset] = (byte)(255 - ((255 - rowPtr1[pixelOffset]) * (255 - rowPtr2[pixelOffset]) >> 8)); // B
                rowPtrBlended[pixelOffset + 1] = (byte)(255 - ((255 - rowPtr1[pixelOffset + 1]) * (255 - rowPtr2[pixelOffset + 1]) >> 8)); // G
                rowPtrBlended[pixelOffset + 2] = (byte)(255 - ((255 - rowPtr1[pixelOffset + 2]) * (255 - rowPtr2[pixelOffset + 2]) >> 8)); // R
                rowPtrBlended[pixelOffset + 3] = (byte)255; // A
            }
        }
    }

    // Unlock the bits of each image after processing.
    img1.UnlockBits(data1);
    img2.UnlockBits(data2);
    blendedImage.UnlockBits(dataBlended);

    // Display the blended image.
    pictureBoxResult.Image = blendedImage;
}

素材


相关推荐
Hilaku6 小时前
检测开发者工具是否打开?这几种方法让黑客无处遁形🤣
前端·javascript·前端框架
qq_316837756 小时前
uniapp 缓存指定接口的响应,在无网络时使用缓存数据
前端·uni-app
GIS开发特训营6 小时前
2025年华中农业大学暑期实训优秀作品(4):智慧煤仓监控系统平台——重塑煤炭仓储管理新模式
前端·vue.js·信息可视化
煤球王子6 小时前
简单了解:Android14中的Input event
android
腾讯云云开发6 小时前
【CloudBase MCP 升级福利】你的AI开发搭子已进化!晒出AI Coding项目领取周边礼品
前端·后端·小程序·云开发
Web极客码6 小时前
如何在WordPress网站中添加Cookie弹窗
前端·安全·github·wordpress
这儿有一堆花6 小时前
从 Markdown 到 HTML 的正确构建路径
前端·html
2501_915921436 小时前
从 HBuilder 到 App Store,uni-app 与 HBuilder 项目的 iOS 上架流程实战解析
android·ios·小程序·https·uni-app·iphone·webview
LeeAt6 小时前
手搓一个 Ollama 本地 SSE 全栈聊天助手
前端
全_6 小时前
全栈项目实践五:抽离npm包
前端