ilovecomputer66 发表于 2023-1-17 21:16

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

请提供具体的代码,而不是说 用opencv,imagesharp就这样。求一下具体高效实现的代码

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

cdj68765 发表于 2023-1-18 00:04

      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:
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;
                Rgba32 pixelB = imageB;
                // 如果 B 图的 alpha 值为 0,则使用 A 图的像素值
                if (pixelB.A == 0)
                {
                  imageA = pixelA;
                }
                else
                {
                     // 如果 B 图的 alpha 值不为 0,则 C alpha = 255
                  var imageC = new Rgba32();
                  imageC.A = 255;
                  imageA = 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什么都搞不清楚。。。
真是搞笑,请问到底是谁不清楚?
你但凡动动手指搜索一下就知道这个可以完美的解决你的问题。
自己啥都不知道就在那里喷,别人浪费时间回答你问题即使回答错了也没必要这样阴阳怪气吧?
何况人家回答的完全没问题。
页: [1] 2 3
查看完整版本: C#不用效率极低的bitmap,是否有其他合适库的具体代码做到:去掉一张图指定像素?