write_image 是一个可以用来保存图片的算子,可以将Image对象保存成各种格式的图片。还可以对图片进行压缩。
Image(输入对象): 输入图像或输入图像的数组。支持的像素类型包括byte、direction、cyclic、int1、complex、int2、uint2、vector_field、int4、int8和real。
Format(输入控制): 要保存图像的图形格式。支持的格式包括:
FillColor(输入控制): 不属于图像域(区域)的像素的填充灰度值。对于灰度值图像,必须传递0(黑色)到255(白色)之间的值。对于RGB彩色图像,RGB值可以直接传递为十六进制值,例如,对于黄色背景,可以传递0xffff00(红=255,绿=255,蓝=0)。
FileName(输入控制): 图像文件的名称,包括文件扩展名。具体的扩展名取决于所选择的图形格式。
TIFF格式:
BMP格式:
JPEG格式:
JPEG-2000格式:
JPEG-XR格式:
PNG格式:
HALCON Iconic Object(HOBJ)格式:
HALCON格式:
如果参数值正确,write_image
操作符将返回值2(H_MSG_TRUE)。否则,将引发异常。
要将图像保存为PNG格式并实现压缩,你可以在 write_image
操作符的 Format
参数中指定压缩级别。压缩级别可以是介于0和9之间的整数,其中0表示无压缩,9表示最佳压缩。此外,你还可以使用一些字符串来选择压缩级别,如’best’表示最佳压缩,'fastest’表示最快速度,'none’表示无压缩。
以下是将图像保存为PNG格式并进行压缩的示例:
// 将图像保存为PNG格式并设置压缩级别
write_image(Image, 'png 5', 0, 'output.png');
在上述示例中,'png 5'
指定了压缩级别为5。你可以根据需要调整压缩级别。如果你希望实现最佳压缩,可以将字符串设置为 'png best'
。
// 将图像保存为PNG格式并使用最佳压缩级别
write_image(Image, 'png best', 0, 'output.png');
请注意,使用更高的压缩级别可能会导致保存过程变慢,因此你可能需要权衡压缩率和性能。
当你想将图像保存成 JPEG 格式时,可以使用 write_image
操作符,并设置格式参数为 'jpeg'
,同时可以通过指定质量参数来调整 JPEG 的压缩质量。以下是详细介绍:
write_image(Image, 'jpeg [quality]', FillColor, 'output.jpg');
// 保存为 JPEG 格式,压缩质量为 90
write_image(Image, 'jpeg 90', 0, 'output.jpg');
根据你的具体需求,可以根据测试和实验来选择合适的质量参数和其他选项。
这里我写了一个程序进行测试:
HObject img;
HOperatorSet.ReadImage(out img, "1.tif");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "png fastest", 0, "p1");
stopwatch.Stop();
Debug.WriteLine($"png fastest: {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "png bset", 0, "p2");
stopwatch.Stop();
Debug.WriteLine($"png bset: {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "tiff", 0, "t");
stopwatch.Stop();
Debug.WriteLine($"tiff: {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "bmp", 0, "b");
stopwatch.Stop();
Debug.WriteLine($"bmp: {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "jpeg", 0, "j1");
stopwatch.Stop();
Debug.WriteLine($"jpeg: {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "jpeg 30", 0, "j2");
stopwatch.Stop();
Debug.WriteLine($"jpeg 30: {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
HOperatorSet.WriteImage(img, "jpeg 90", 0, "j3");
stopwatch.Stop();
Debug.WriteLine($"jpeg 90: {stopwatch.ElapsedMilliseconds}");
读取的是一张56M图片,是黑白的,执行结果如下(单位ms):
png fastest: 1247
png bset: 3421
tiff: 144
bmp: 179
jpeg: 126
jpeg 30: 100
jpeg 90: 183
最快的是 jpeg 压缩质量为30的时候。虽然质量只有30,但一眼看上去也没啥区别,不过大小是小的真的多(不愧是是有损压缩!)。