我正在开发一个将文本放入背景图像的应用程序。文本块作为子项放置在画布控件上,我将画布渲染为 PNG。然后我使用 BlendEffect 将它与背景图像混合。
更新 这篇文章专门介绍了使用 Lumia Imaging SDK 的链接效果。不幸的是,其中一位评论者的视野狭隘,并坚持认为我必须了解有损图像和无损图像之间的区别。在我的上下文中告诉孩子如何在 Microsoft Paint 中保存图像一样有用的意见。在其他一些评论中,他甚至傲慢地希望我的应用程序中一定有大量错误并且有一些心理问题。
我是来学习 Lumia Imaging 的,显然遇到了一个对那个 SDK 毫无经验的人,还坚持要炫耀。然后对这个帖子投了反对票,让自己感觉更好。
话虽如此,@Martin Liversage 指出这不仅仅是 JPEG 伪影,这很有帮助。我尝试在另存为 JPEG 的同时使用几个链接步骤和选项,并且确实图像的显示方式有所不同。虽然保存为 PNG 确实提高了质量,但它仍然不是我所期望的。因此,我在这里向任何有使用 SDK 的个人经验的人询问我可以在我的代码中做些什么来改进我的结果。
这是我的代码
private async void saveChainedEffects(StorageFile file)
{
var displayInformation = DisplayInformation.GetForCurrentView();
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(Textify.CanvasControl);
var width = renderTargetBitmap.PixelWidth;
var height = renderTargetBitmap.PixelHeight;
IBuffer textBuffer = await renderTargetBitmap.GetPixelsAsync();
byte[] pixels = textBuffer.ToArray();
using (InMemoryRandomAccessStream memoryRas = new InMemoryRandomAccessStream())
{
//Encode foregroundtext to PNG
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, memoryRas);
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Straight,
(uint)width,
(uint)height,
displayInformation.LogicalDpi,
displayInformation.LogicalDpi,
pixels);
await encoder.FlushAsync();
IImageProvider effectBackground;
if (SelectedEffect.Name == "No Effect")
{
effectBackground = imageProcessorRenderer.M_Source;
}
else
{
effectBackground = (SelectedEffect.GetEffectAsync(imageProcessorRenderer.M_Source, new Size(), new Size())).Result;
}
StreamImageSource streamForeground = new StreamImageSource(memoryRas.AsStream());
//Sharpening the text has unintended consequences to I set to 0d
using (SharpnessEffect sharpnessEffect = new SharpnessEffect(streamForeground, 0d) )
using (BlendEffect blendEffect = new BlendEffect(effectBackground, sharpnessEffect, BlendFunction.Normal, 1.0f))
{
string errorMessage = null;
Debug.WriteLine("M_SourceSize (Normalized) {0}", imageProcessorRenderer.M_SourceSize);
Debug.WriteLine("PreviewSize {0}", imageProcessorRenderer.PreviewSize);
try
{
using (var filestream = await file.OpenAsync(FileAccessMode.ReadWrite))
using (var jpegRenderer = new JpegRenderer(blendEffect) { Size = imageProcessorRenderer.M_SourceSize, Quality = 1.0, RenderOptions = RenderOptions.Mixed })
{
IBuffer jpegBuffer = await jpegRenderer.RenderAsync().AsTask().ConfigureAwait(false);
await filestream.WriteAsync(jpegBuffer);
await filestream.FlushAsync();
}
}
catch (Exception exception)
{
errorMessage = exception.Message;
}
if (!string.IsNullOrEmpty(errorMessage))
{
var dialog = new MessageDialog(errorMessage);
await dialog.ShowAsync();
}
}
}
}
这是保存为 JPEG 之前在我的 PC 屏幕上看到的图像
然后,当图像保存为 JPG 时,质量会明显降低,如下所示。放大图像并注意字体的边缘。
那么,如果我想尽可能接近原始图像质量,我有哪些选择?