我正在尝试在 Xamarin Forms 中创建一个功能,该功能允许应用程序将图像的 [1..N] 颜色更改为 [1..N]。
例子:
将所有蓝色和紫色像素更改为黄色和橙色像素
经过一番调查,似乎我需要创建一个自定义 CIColorKernel 来实现它。
问题是很难找到示例并且文档很简单。
如果有人有教程或基本示例可以开始...
谢谢
编辑 :
我实现了@SushiHangover 的soutioion,并在代码示例的第二种方法中调用它:
private IImageSourceHandler GetHandler(ImageSource source)
{
IImageSourceHandler returnValue = null;
if (source is UriImageSource)
{
returnValue = new ImageLoaderSourceHandler();
}
else if (source is FileImageSource)
{
returnValue = new FileImageSourceHandler();
}
else if (source is StreamImageSource)
{
returnValue = new StreamImagesourceHandler();
}
return returnValue;
}
public async Task<ImageSource> ChangeImageColor(ImageSource source, string oldColor, string newColor)
{
var handler = GetHandler(source);
var uiImage = (UIImage)null;
uiImage = await handler.LoadImageAsync(source);
UIImage uiImageOutput = null;
using (var context = new EAGLContext(EAGLRenderingAPI.OpenGLES3))
using (var filter = new ColorReplaceFilter
{
InputImage = new CIImage(uiImage),
MatchColor = CIColor.FromRgb(200, 200, 200),
ReplaceWithColor = CIColor.RedColor,
Threshold = 1f // Exact match, values >0 & <=1 to make a fuzzy match
})
{
uiImageOutput = UIImage.FromImage(filter.OutputImage);
}
return Xamarin.Forms.ImageSource.FromStream(() => uiImageOutput.AsPNG().AsStream()); ;
}
这两种方法位于一个名为的类中,该类BitmapHelper
在Xamarin Forms项目中使用Dependecy Injection调用。
var bitmap = DependencyService.Get<IBitmapHelper>().ChangeImageColor(AmbiancePicture.Source, oldColor, newColor);
AmbiancePicture.Source = bitmap.Result;
结果包含预期的新图像,AmbiancePicture.Source
但未更新。
这是我尝试更改的图像:
编辑 2:
如果我在更新前将 AmbiancePicture.Source 设置为 null,则图像保持为空。图像似乎不是空的(我在流中看到了一些正确的属性)。
工作编辑:
所以在错误来自 UIImage 创建和转换之后。
这是工作代码:
using (var context = new EAGLContext(EAGLRenderingAPI.OpenGLES3))
using (var filter = new ColorReplaceFilter
{
InputImage = new CIImage(uiImage),
MatchColor = CIColor.FromString(oldColor),
ReplaceWithColor = CIColor.FromString(newColor),
Threshold = 1f // Exact match, values >0 & <=1 to make a fuzzy match
})
{
var output = context.CreateCGImage(filter.OutputImage, filter.OutputImage.Extent); // This line is slow...
var img = UIImage.FromImage(output);
jpegData = img.AsJPEG(1.0f);
}
return Xamarin.Forms.ImageSource.FromStream(() => jpegData.AsStream());