SaveJpeg 导致“阴影”具有透明度的工件
只是想跟你确认一件事。我正在使用 WriteableBitmap 创建一个图像,并将其用作活动磁贴。工作正常,但我注意到文本边缘有阴影。使文字看起来有点脏或乱。
看看下面的图片。左侧部分来自使用 WriteableBitmap 创建的活动磁贴,右侧部分是 Windows Phone 标准磁贴(Internet Explorer 磁贴)。看到区别了吗?
有什么我对此可以做什么?您以前注意到过这一点吗?
编辑: 嗯,我想我看错了函数。我认为这可能是 wbmp.SaveJpeg 造成的?我将文本和背景图像放入网格中,然后使用 wbmp.SaveJpeg 保存。是这个原因吗?有什么解决方法吗?
string sIsoStorePath = @"\Shared\ShellContent\tile.png";
using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
//ensure directory exists
String sDirectory = System.IO.Path.GetDirectoryName(sIsoStorePath);
if (!appStorage.DirectoryExists(sDirectory))
{
appStorage.CreateDirectory(sDirectory);
}
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(sIsoStorePath, System.IO.FileMode.Create, appStorage))
{
wbmp.SaveJpeg(stream, 173, 173, 0, 100);
}
}
Just wanted to check one thing with you. I'm using WriteableBitmap to create an image that I'm as a live tile. Works fine but I have noticed that text is getting a shadow around the edges. Makes the text look a bit dirty or messy.
Take a look at the image below. The left part is from a live tile created using the WriteableBitmap and the right part is a Windows Phone standard tile (The Internet Explorer tile). See the difference?
Is there anything I can do about this? Have you noticed this before?
EDIT:
Hmm, I think I'm looking at the wrong function. I think it could be the wbmp.SaveJpeg that is causing this? I'm putting text and a background image to the grid and then saving it with wbmp.SaveJpeg. Is this the reason? Any workarounds?
string sIsoStorePath = @"\Shared\ShellContent\tile.png";
using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
//ensure directory exists
String sDirectory = System.IO.Path.GetDirectoryName(sIsoStorePath);
if (!appStorage.DirectoryExists(sDirectory))
{
appStorage.CreateDirectory(sDirectory);
}
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(sIsoStorePath, System.IO.FileMode.Create, appStorage))
{
wbmp.SaveJpeg(stream, 173, 173, 0, 100);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
WritableBitmap.Pixels 指出“Silverlight WriteableBitmap 使用的格式是 ARGB32(预乘 RGB)”。也许活动图块需要非预乘像素格式。
我在 Silverlight 中找不到任何 API 来更改格式,但我认为本文中的方法可能正是您需要的:
http://nokola.com/blog/post/2010/01/27/The-Most-Important-Silverlight-WriteableBitmap-Gotcha-Does-It-LoseChange-Colors.aspx
编辑:
根据我的测试,问题似乎出在 JPEG 压缩伪像上,因为 SaveJpeg 会以 JPEG 格式保存文件,即使您使用 .png 扩展名命名它们。
下面的示例代码有一个对 MakeNonPremultiplied(bitmap.Pixels) 的注释掉调用,它显示了如果您使用某些库将其保存为适用于透明度和期望的文件格式,则如何调用过滤器将像素格式修改为非预乘非预乘格式。
The documentation for WritableBitmap.Pixels states that the "format used by the Silverlight WriteableBitmap is ARGB32 (premultiplied RGB)". Perhaps then the live tiles expect a non-premultiplied pixel format.
I could not find any API in Silverlight to change the format, but I think the method in this article might be what you need:
http://nokola.com/blog/post/2010/01/27/The-Most-Important-Silverlight-WriteableBitmap-Gotcha-Does-It-LoseChange-Colors.aspx
Edit:
From my testing it seems like the problem is with JPEG compression artifacts after all, since SaveJpeg saves files in JPEG format even if you name them with a .png extension.
My example code below has a commented out call to MakeNonPremultiplied(bitmap.Pixels) that shows how you would call the filter to modify pixel format to non-premultiplied if you used some library to save it to a file format that works with transparencies and expects non-premultiplied format.
我遇到了完全相同的问题,但对我来说简单的答案是检查使用的透明 PNG。它被设置为使用 16 位颜色深度。将 PNG 更改为 8 位颜色深度解决了我的问题。
I had the exact same problem, but the simple answer for me was to check the transparent PNG used. It was set to use 16 bit color depth. Changing the PNGs to to 8 bit color depth solved the problem for me.