C#不用效率极低的bitmap,是否有其他合适库的具体代码做到:去掉一张图指定像素?
请提供具体的代码,而不是说 用opencv,imagesharp就这样。求一下具体高效实现的代码需求是:原图A(可能是没有alpha的jpg),然后另一个一样大小的图B(png格式,带alpha)。然后把B图的alpha作用到A上,即B图透明的部分,最终得到的png中就是透明的,B中不透明部门,取A中的像素颜色,最终变成带alpha的图C(png) 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 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");
}
}
感谢楼上两位,我写个小程序,测试下两个库的效率,然后给大家说结果 @cdj68765 @MIAIONE ilovecomputer66 发表于 2023-1-18 09:06
感谢楼上两位,我写个小程序,测试下两个库的效率,然后给大家说结果 @cdj68765 @MIAIONE
SixLabors.ImageSharp 循环尽量使用内置的processpixelrow方法, span类型性能比for一个个的高 MIAIONE 发表于 2023-1-18 09:13
SixLabors.ImageSharp 循环尽量使用内置的processpixelrow方法, span类型性能比for一个个的高
能否贴下代码,没用过这个库,不太了解这个processpixelrow是哪个类下的,在IDE没试出来 你可以考虑下使用指针进行循环,比单纯的for 快很多 izhen 发表于 2023-1-18 11:00
你可以考虑下使用指针进行循环,比单纯的for 快很多
兄弟,你别乱答了行不行。C#还指针呢
刚才你另一个帖子,连百度飞浆PaddleSegSharp干什么的都搞不清,也乱答 ilovecomputer66 发表于 2023-1-18 11:12
兄弟,你别乱答了行不行。C#还指针呢
刚才你另一个帖子,连百度飞浆PaddleSegSharp干什么的都搞不清,也 ...
C#操作位图想要高效率的话都是unsafe用指针,人家好心回答你你何必冷嘲热讽?
C#用指针有什么问题? ilovecomputer66 发表于 2023-1-18 11:12
兄弟,你别乱答了行不行。C#还指针呢
刚才你另一个帖子,连百度飞浆PaddleSegSharp干什么的都搞不清,也 ...
另外你说人家PaddleSegSharp什么都搞不清楚。。。
真是搞笑,请问到底是谁不清楚?
你但凡动动手指搜索一下就知道这个可以完美的解决你的问题。
自己啥都不知道就在那里喷,别人浪费时间回答你问题即使回答错了也没必要这样阴阳怪气吧?
何况人家回答的完全没问题。