Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing ppm或bmp的更压缩版本?_Image Processing_Graphics - Fatal编程技术网

Image processing ppm或bmp的更压缩版本?

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

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

这是一种“块状”的计算机图形类型的叠加,具有1182x862像素

以下是您可能希望尝试的其他格式的尺寸:

-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编码。。。然而,可能会有所不同