【发布时间】:2018-05-26 17:54:55
【问题描述】:
我一直在尝试使用名为 ImageSharp 的图像处理器,因为 System.Drawing 在 asp.net 核心上不可用,而且 System.Drawing 可能会遇到麻烦。
我想用图像中的特定纹理填充空白。下面的代码正在运行,但速度非常慢。
因为这是我第一次处理图像,我真的不知道最有效的方法是什么。
用纹理填充空白的最佳和有效方法是什么。
结果如下: Doughnut
对此: Sparkly Doughnut
public void CreateImage()
{
var webRoot = _env.WebRootPath;
var ImgSrc = "\\Images\\SampleImage.png";
var TextureURL = "\\Images\\Starsinthesky.jpg";
var file = webRoot + ImgSrc;
var texture = webRoot + TextureURL;
var myPath = Path.Combine(webRoot, ImgSrc);
byte[] img;
using (Image<Rgba32> image = Image.Load(file))
{
HashSet<Texture> textureArr = getRGBaBytes(texture, image);
for (int h = 0; h <= image.Height; h++)
{
for(int w = 0; w <= image.Width; w++)
{
if(image[w,h] == Rgba32.FromHex("#ffffff"))
{
image[w, h] = textureArr.Where(t => t.x == w && t.y == h).First().color;
}
}
}
image.Save("NewImage.png");
}
}
public HashSet<Texture> getRGBaBytes(string textureURL, Image<Rgba32> sample)
{
using (Image<Rgba32> tex = Image.Load(textureURL))
{
int bitsizelimit = int.MaxValue;
if (sample.Width > tex.Width || sample.Height > tex.Height)
{
throw new Exception("Texture image dimensions must be greater or equal to sample image");
}
HashSet<Texture> myTexture = new HashSet<Texture>();
for (int h = 0; h <= sample.Height; h++)
{
for (int w = 0; w <= sample.Width; w++)
{
System.Diagnostics.Debug.WriteLine($"{tex[w,h].ToHex()} at x:{w} y:{h}");
myTexture.Add(new Texture { color = tex[w, h], x = w, y = h });
}
}
return myTexture;
}
}
public class Texture
{
public Rgba32 color { get; set; }
public int x { get; set; }
public int y { get; set; }
}
【问题讨论】:
-
在创建
Texture集合时不要使用HashSet,为什么不直接使用二维数组,基本上你已经在使用它了。这应该有助于你的表现。我打算制作一个测试程序并测试它,但我无法让它在 LinqPad 中运行,抱歉。 -
另一件可能有帮助的事情是将这条线
Rgba32.FromHex("#ffffff")提升到你的双重嵌套循环之外。优化器可能会注意到它是一个常量,并且只会执行一次创建,但如果不是,那么您将为图像中的每个像素创建相同的颜色,以便您检查它是否为白色。跨度>
标签: c# image-processing graphics asp.net-core imagesharp