【问题标题】:SVG/PNG files open differently in the browserSVG/PNG 文件在浏览器中的打开方式不同
【发布时间】:2017-12-15 05:37:35
【问题描述】:

我正在做一个项目,我们的数据库是 svg 格式。现在,奇怪的事情(我对图像格式了解不多)是,如果我在 Image Viewer、ImageMagick 或 Pinta 等计算机程序上打开它,图像看起来完全不同,当我打开它时图像看起来如何浏览器(Mozilla 或 Chrome)。为方便起见,我附上了一张图片(从 svg 转换为 png),您可以看到,如果您在浏览器上打开它与普通程序(如果您下载并在计算机上打开它)相比,差异真的很大。

现在,我在 Python 上打开它以查看发生了什么,显然图像是 RBGA 格式。我想将其转换为 RGB,并使用以下代码:

img = Image.open(os.path.join(PNG_REPO, page)[:-4] + ".png")
arr = np.array(img)
rgbImage = cv2.cvtColor(arr, cv2.COLOR_RGBA2RGB)
img = Image.fromarray(rgbImage)
img.save("please.png")

然后,奇怪的事情发生了。图像似乎已经完全变黑了(附在下面),在 Python、本地程序或浏览器上打开它已经没有任何区别了。

有人知道发生了什么吗?我认为我正在失去它,我完全被卡住了。

【问题讨论】:

    标签: python image svg png


    【解决方案1】:

    事实上,SVG 和 PNG 是完全不同的。

    SVG(可缩放矢量图形)不是标准图像格式:图像不存储为像素(或导数),而是矢量化格式。要显示它,您必须将矢量渲染为像素,然后显示它们。这种方法的最大优势是质量与尺寸:对于插图,您可以在几乎没有尺寸的情况下获得出色的质量,但是,它需要更多的时间来处理,并且解码与其他图像格式非常不同,因此它图像查看器通常不支持,并且渲染可能在一定程度上取决于渲染器。

    另一方面,PNG(便携式网络图形)仍然基于像素,并且得到了非常广泛的支持。

    至于您的问题,您的图像具有 alpha(透明度)通道。将其转换为 RGB 时,您将摆脱这种透明度,opencv 将其转换为固定颜色。这里,这个颜色是(0,0,0),也就是黑色。

    你应该试试这个:

    img = Image.open(os.path.join(PNG_REPO, page)[:-4] + ".png")
    img.load()
    new_img = Image.new("RGB", img.size, (255, 255, 255))
    new_img.paste(img, mask=img.split()[3]) # 3 is the alpha channel
    new_img.save("should_be_good.png")
    

    【讨论】:

    • 确实,这很好。 (当然不是第三行和第四行的png,应该是img)。我知道 SVG 和 PNG 是完全不同的格式,但我认为从一种格式转换为另一种格式(我使用 cairosvg)很好。好吧,如果我这样做然后继续执行您的代码,那么 PNG 文件看起来与 SVG 文件非常相似。
    • 我修复了我的代码,抱歉!很高兴知道这有帮助。您的转换似乎很好,只是 openCV 处理透明度非常糟糕(我的意思是它不会让您选择使用不同的背景颜色)
    • 谢谢!我花了两个小时试图做到这一点。在相关说明中,您知道从音乐中删除页眉和页脚的最简单方法是什么吗?
    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2019-09-30
    • 2011-04-21
    相关资源
    最近更新 更多