Image processing ppm或bmp的更压缩版本?
我正在使用自定义绘制的图形在视频流上添加一个层,但是当我为当前帧保存绘制的层时,我有一个相当大的文件(~10MB)。在分析数据时,它主要是0(表示视频的实际像素,而不是绘制的层)。我知道PPM和BMP文件本质上是相当大的文件,但是有没有办法处理0的重复性?我应该检查的文件格式是否不同?这是一种“块状”的计算机图形类型的叠加,具有1182x862像素 以下是您可能希望尝试的其他格式的尺寸:Image processing ppm或bmp的更压缩版本?,image-processing,graphics,Image Processing,Graphics,我正在使用自定义绘制的图形在视频流上添加一个层,但是当我为当前帧保存绘制的层时,我有一个相当大的文件(~10MB)。在分析数据时,它主要是0(表示视频的实际像素,而不是绘制的层)。我知道PPM和BMP文件本质上是相当大的文件,但是有没有办法处理0的重复性?我应该检查的文件格式是否不同?这是一种“块状”的计算机图形类型的叠加,具有1182x862像素 以下是您可能希望尝试的其他格式的尺寸: -rw-r--r--@ 1 mark staff 3056668 24 Nov 08:49 overl
-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的高度和宽度,如果你能在缩放时处理两个像素不准确的话,可以使它们的体积减少16X。
您也可以考虑生成一个向量格式的覆盖,它的大小应该很多很多倍。 从文档中直接提取,下面是一个SVG矢量示例:
#!/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')
这相当于14202字节的PNG或1348字节的SVG,因此矢量图形的体积要小10倍
-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:
<?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>
或者从PPM到四分之一高和四分之一宽GIF,如下所示:
magick input.ppm output.png
magick input.ppm -scale 25% result.gif
请注意,ImageMagick不会将转换为SVG——因为它是一个光栅图形程序,甚至在启动之前都会将所有内容光栅化。它将从SVG转换为光栅。使用PNG对线条图和类似图形进行最佳压缩。使用JPEG处理照片图像(或更好的JPEG2000,但这并没有广泛传播)。正如Cris所说,但GIF还可以压缩计算机图形和“块状”重复内容,颜色少于250种。虽然是“过去的爆炸”,
PCX
也可以进行RLE(运行长度编码),并且可以与Photoshop配合使用,GIMP和ImageMagick@MarkSetchell也很容易解码PCX,只需几行代码或编码也很容易和快速…@MarkSetchell我也得到了RT GIF编码器/解码器,但它要大得多,对于大分辨率来说太慢了。。。我也得到了基于DCT的图像压缩工作,但这是一个太慢的RT编码。。。然而,可能会有所不同