吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1408|回复: 25
收起左侧

[求助] C#不用效率极低的bitmap,是否有其他合适库的具体代码做到:去掉一张图指定像素?

  [复制链接]
ilovecomputer66 发表于 2023-1-17 21:16
请提供具体的代码,而不是说 用opencv,imagesharp就这样。求一下具体高效实现的代码

需求是:原图A(可能是没有alpha的jpg),然后另一个一样大小的图B(png格式,带alpha)。然后把B图的alpha作用到A上,即B图透明的部分,最终得到的png中就是透明的,B中不透明部门,取A中的像素颜色,最终变成带alpha的图C(png)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cdj68765 发表于 2023-1-18 00:04
[C#] 纯文本查看 复制代码
        using var imageB = SKBitmap.Decode("imageB.png");
        using var imageA = SKBitmap.Decode("imageA.jpg");
        using var pixelsB = imageB.PeekPixels();
        using var pixelsA = imageA.PeekPixels();
        for (int y = 0; y < imageB.Height; y++)
        {
            for (int x = 0; x < imageB.Width; x++)
            {
                var colorB = pixelsB.GetPixelColor(x, y);
                var alpha = colorB.Alpha;
                var colorA = pixelsA.GetPixelColor(x, y);
                imageA.SetPixel(x, y, new SKColor(colorA.Red, colorA.Green, colorA.Blue, alpha));
            }
        }
        using var stream = new FileStream("imageC.png", FileMode.Create);
        imageA.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);

不知道这样的代码能不能满足你,效率也无法保证,毕竟也是单纯的双重遍历
用的库是SkiaSharp
MIAIONE 发表于 2023-1-18 08:39
本帖最后由 MIAIONE 于 2023-1-18 09:00 编辑

使用 SixLabors.ImageSharp 库 或者@cdj68765 的方法 SkiaSharp处理

下面是一个简单的 demo:
[C#] 纯文本查看 复制代码
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

// 读入图片 A
using (Image<Rgba32> imageA = Image.Load<Rgba32>("imageA.jpg"))
{
    // 读入图片 B
    using (Image<Rgba32> imageB = Image.Load<Rgba32>("imageB.png"))
    {
        // 遍历每一个像素
        for (int x = 0; x < imageA.Width; x++)
        {
            for (int y = 0; y < imageA.Height; y++)
            {
                Rgba32 pixelA = imageA[x, y];
                Rgba32 pixelB = imageB[x, y];
                // 如果 B 图的 alpha 值为 0,则使用 A 图的像素值
                if (pixelB.A == 0)
                {
                    imageA[x, y] = pixelA;
                }
                else
                {
                     // 如果 B 图的 alpha 值不为 0,则 C alpha = 255
                    var imageC = new Rgba32();
                    imageC.A = 255;
                    imageA[x, y] = imageC;
                }
            }
        }
        // 保存图片 C
        imageA.Save("imageC.png");
    }
}

 楼主| ilovecomputer66 发表于 2023-1-18 09:06
感谢楼上两位,我写个小程序,测试下两个库的效率,然后给大家说结果 @cdj68765 @MIAIONE
MIAIONE 发表于 2023-1-18 09:13
ilovecomputer66 发表于 2023-1-18 09:06
感谢楼上两位,我写个小程序,测试下两个库的效率,然后给大家说结果 @cdj68765 @MIAIONE

SixLabors.ImageSharp 循环尽量使用内置的processpixelrow方法, span类型性能比for一个个的高
 楼主| ilovecomputer66 发表于 2023-1-18 09:47
MIAIONE 发表于 2023-1-18 09:13
SixLabors.ImageSharp 循环尽量使用内置的processpixelrow方法, span类型性能比for一个个的高

能否贴下代码,没用过这个库,不太了解这个processpixelrow是哪个类下的,在IDE没试出来
izhen 发表于 2023-1-18 11:00
你可以考虑下使用指针进行循环,比单纯的for 快很多
 楼主| ilovecomputer66 发表于 2023-1-18 11:12
izhen 发表于 2023-1-18 11:00
你可以考虑下使用指针进行循环,比单纯的for 快很多

兄弟,你别乱答了行不行。C#还指针呢
刚才你另一个帖子,连百度飞浆PaddleSegSharp干什么的都搞不清,也乱答
chinasmu 发表于 2023-1-18 11:26
ilovecomputer66 发表于 2023-1-18 11:12
兄弟,你别乱答了行不行。C#还指针呢
刚才你另一个帖子,连百度飞浆PaddleSegSharp干什么的都搞不清,也 ...

C#操作位图想要高效率的话都是unsafe用指针,人家好心回答你你何必冷嘲热讽?
C#用指针有什么问题?
chinasmu 发表于 2023-1-18 11:32
ilovecomputer66 发表于 2023-1-18 11:12
兄弟,你别乱答了行不行。C#还指针呢
刚才你另一个帖子,连百度飞浆PaddleSegSharp干什么的都搞不清,也 ...

另外你说人家PaddleSegSharp什么都搞不清楚。。。
真是搞笑,请问到底是谁不清楚?
你但凡动动手指搜索一下就知道这个可以完美的解决你的问题。
自己啥都不知道就在那里喷,别人浪费时间回答你问题即使回答错了也没必要这样阴阳怪气吧?
何况人家回答的完全没问题。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表