首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更多压缩版本的ppm或bmp?

更多压缩版本的ppm或bmp?
EN

Stack Overflow用户
提问于 2020-11-24 13:27:49
回答 1查看 45关注 0票数 1

我在我的视频流上添加了一个带有自定义绘制图形的图层,但是当我为当前帧保存绘制的图层时,我有一个相当大的文件(~10MB)。在分析数据时,它大多是0(表示视频的实际像素,而不是绘制的图层)。我知道PPM和BMP文件本来就是相当大的文件,但是有没有办法处理0的重复性呢?有没有不同的文件格式我应该检出?

EN

回答 1

Stack Overflow用户

发布于 2020-11-24 17:00:01

这是一个1182x862像素的“块状”的计算机图形覆盖图。

下面是你可能想要尝试的其他格式的大小:

代码语言:javascript
运行
复制
-rw-r--r--@ 1 mark  staff  3056668 24 Nov 08:49 overlay.ppm
-rw-r--r--@ 1 mark  staff    23699 24 Nov 08:49 overlay.gif
-rw-r--r--  1 mark  staff   134723 24 Nov 08:49 overlay.pcx
-rw-r--r--@ 1 mark  staff    22585 24 Nov 08:48 overlay.png

请注意,它们都有一些折衷。虽然PNG是最小的,但它可能需要更长的时间来编写。GIF本身表现得很好,但如果你的颜色太多,效果就会很差。PCX有点过时,但很有用。PPM很大,大小与覆盖大小成正比。

请注意,如果您的覆盖真的非常块状,您可以考虑将它们减少到高度和宽度的1/4,并使它们的体积缩小16倍,如果您可以处理几个像素不准确时重新缩放。

你也可以考虑生成一个矢量格式的覆盖图,它的大小应该小很多很多倍。

直接取自DrawSvg文档,下面是一个SVG向量示例:

代码语言:javascript
运行
复制
#!/usr/bin/env python3

import drawSvg as draw

d = draw.Drawing(200, 100, origin='center', displayInline=False)

# Draw an irregular polygon
d.append(draw.Lines(-80, -45,
                    70, -49,
                    95, 49,
                    -90, 40,
                    close=False,
            fill='#eeee00',
            stroke='black'))

# Draw a rectangle
r = draw.Rectangle(0,0,40,50, fill='#1248ff')
r.appendTitle("Our first rectangle")  # Add a tooltip
d.append(r)

# Draw a circle
d.append(draw.Circle(-40, -10, 30,
            fill='red', stroke_width=2, stroke='black'))

# Draw an arbitrary path (a triangle in this case)
p = draw.Path(stroke_width=2, stroke='green',
              fill='black', fill_opacity=0.5)
p.M(-30,5)  # Start path at point (-30, 5)
p.l(60,30)  # Draw line to (60, 30)
p.h(-70)    # Draw horizontal line to x=-70
p.Z()       # Draw line to start
d.append(p)

# Draw multiple circular arcs
d.append(draw.ArcLine(60,-20,20,60,270,
            stroke='red', stroke_width=5, fill='red', fill_opacity=0.2))
d.append(draw.Arc(60,-20,20,60,270,cw=False,
            stroke='green', stroke_width=3, fill='none'))
d.append(draw.Arc(60,-20,20,270,60,cw=True,
            stroke='blue', stroke_width=1, fill='black', fill_opacity=0.3))

# Draw arrows
arrow = draw.Marker(-0.1, -0.5, 0.9, 0.5, scale=4, orient='auto')
arrow.append(draw.Lines(-0.1, -0.5, -0.1, 0.5, 0.9, 0, fill='red', close=True))
p = draw.Path(stroke='red', stroke_width=2, fill='none',
              marker_end=arrow)  # Add an arrow to the end of a path
p.M(20, -40).L(20, -27).L(0, -20)  # Chain multiple path operations
d.append(p)
d.append(draw.Line(30, -20, 0, -10,
            stroke='red', stroke_width=2, fill='none',
            marker_end=arrow))  # Add an arrow to the end of a line

d.setPixelScale(2)  # Set number of pixels per geometry unit
#d.setRenderSize(400,200)  # Alternative to setPixelScale
d.saveSvg('example.svg')
d.savePng('example.png')

这相当于14,202字节的PNG或1,348字节的SVG --所以矢量图形要小10倍!

代码语言:javascript
运行
复制
-rw-r--r--     1 mark  staff       1348 24 Nov 10:01 example.svg
-rw-r--r--     1 mark  staff      14202 24 Nov 10:01 example.png

下面是SVG:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     width="400" height="200" viewBox="-100.0 -50.0 200 100">
<defs>
<marker markerWidth="4.0" markerHeight="4.0" viewBox="-0.1 -0.5 1.0 1.0" orient="auto" id="d0">
<path d="M-0.1,0.5 L-0.1,-0.5 L0.9,0 Z" fill="red" />
</marker>
</defs>
<path d="M-80,45 L70,49 L95,-49 L-90,-40" fill="#eeee00" stroke="black" />
<rect x="0" y="-50" width="40" height="50" fill="#1248ff">
<title>Our first rectangle</title>
</rect>
<circle cx="-40" cy="10" r="30" fill="red" stroke-width="2" stroke="black" />
<path d="M-30,-5 l60,-30 h-70 Z" stroke-width="2" stroke="green" fill="black" fill-opacity="0.5" />
<circle cx="60" cy="20" r="20" stroke-dasharray="73.30382858376184 52.35987755982988" stroke-dashoffset="-31.41592653589793" stroke="red" stroke-width="5" fill="red" fill-opacity="0.2" />
<path d="M70.0,2.679491924311229 A20,20,0,1,0,59.99999999999999,40.0" stroke="green" stroke-width="3" fill="none" />
<path d="M59.99999999999999,40.0 A20,20,0,1,1,70.0,2.679491924311229" stroke="blue" stroke-width="1" fill="black" fill-opacity="0.3" />
<path d="M20,40 L20,27 L0,20" stroke="red" stroke-width="2" fill="none" marker-end="url(#d0)" />
<path d="M30,20 L0,10" stroke="red" stroke-width="2" fill="none" marker-end="url(#d0)" />
</svg>

如果您想要使用实际数据进行实验,请尝试终端中的ImageMagick。您可以像这样将PPM转换为PNG:

代码语言:javascript
运行
复制
magick input.ppm output.png

或者从PPM到四分之一高和四分之一宽的GIF,如下所示:

代码语言:javascript
运行
复制
magick input.ppm -scale 25% result.gif

请注意,ImageMagick不会将转换为SVG -因为它是一个光栅图形程序,甚至在开始之前就会对所有内容进行光栅化。它会将从SVG转换为光栅。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64980732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档