(已向超级用户询问与应用程序相关的答案类似的问题。该问题发布在此处以收集相同的可编程解决方案)
在我的工作场所,护照大小的照片会一起扫描,然后切割成单独的照片,并以唯一的文件编号保存。目前我们使用 Paint.net 手动选择、剪切和保存图片。
样本扫描文档 Picasa 截图:( 来自:google image search multiple sources, fairuse)
例如。在 Picasa 3.8 中,单击“视图”>“人物”时,会显示所有面孔并要求我为它们命名,我可以将这些单独的图片自动保存为不同的图片名称吗?
更新
我要做的就是将上面的图片转换为单独的图片。
在上图中,我展示了 Picasa 3.8 如何检测图像并提示我为它们命名。我不需要人脸识别,我只需要人脸检测。Picasa 会检测单个图像并将其显示在 RHS 上。这些单独的图像是我需要的。Picasa 创建一个 .ini 文件,该文件保存包含各个面的坐标的十六进制值。
这些单独的面孔是我感兴趣的如果我有坐标,我可以从图片中裁剪出所需的图像。
样品.jpg
ini内容
[SAMPLE.jpg]
faces=rect64(c18f4c8ef407851e),d4ff0a020be5c3c0;rect64(534a06d429ae627),dff6163dfd9d4e41;rect64(b9c100fae46b3046),e1059dcf6672a2b3;rect64(7b5105daac3a3cf4),4fc7332c107ffafc;rect64(42a036a27062a6c),ef86c3326c143248;rect64(31f4efe3bd68fd8),90158b3d3b65dc9b;rect64(327904e0614d390d),43cbda6e92fcb63e;rect64(4215507584ae9b8c),15b6a967e857f334;rect64(895d4efeb8b68425),5c4ff70ac70b27d3
backuphash=3660
*ini 文件似乎将面部标签的坐标保存rect64(534a06d429ae627),dff6163dfd9d4e41
为每个标签。引自Picasa 帮助网站用户Technonath说
@oedious 写道:- 这会有点技术性,所以请稍等。* rect64() 中包含的数字是一个 64 位的十六进制数。* 将其分解为四个 16 位数字。* 将每个数字除以最大无符号 16 位数 (65535),您将有四个介于 0 和 1 之间的数字。 * 剩下的四个数字为您提供面部矩形的相对坐标:(左、上、右、下)。* 如果要以绝对坐标结束,则将左右乘以图像宽度,将顶部和底部乘以图像高度。
上面的引用谈到了 rect64() 中包含的数字,那么逗号后括号外的数字呢?
我问了一个相关的问题。其中的答案也可能对您有所帮助。 从 64 位十六进制值中获取四个 16 位数字
注意:ini 细节与 picasa 为特定图像生成的细节相同。
加上问题已多次更新,可能不够清楚。
Picasa 帮助网站上有一些回复,我在其中提出了相同的问题 来自该线程的答案之一是根据 ini 文件中的十六进制值获取坐标。以下代码来自帮助站点的esac中的 C#。我可以在 PHP 中做同样的事情吗?
public static RectangleF GetRectangle(string hashstr)
{
UInt64 hash = UInt64.Parse(hashstr, System.Globalization.NumberStyles.HexNumber);
byte[] bytes = BitConverter.GetBytes(hash);
UInt16 l16 = BitConverter.ToUInt16(bytes, 6);
UInt16 t16 = BitConverter.ToUInt16(bytes, 4);
UInt16 r16 = BitConverter.ToUInt16(bytes, 2);
UInt16 b16 = BitConverter.ToUInt16(bytes, 0);
float left = l16 / 65535.0F;
float top = t16 / 65535.0F;
float right = r16 / 65535.0F;
float bottom = b16 / 65535.0F;
return new RectangleF(left, top, right - left, bottom - top);
}
PHP 代码 尝试将 64 位转换为 1 到 0 之间的数字
<?php
$dim = getimagesize("img.jpg");
$hex64=array();
$b0="c18f4c8ef407851e";
$hex64[]=substr($b0,0,4);
$hex64[]=substr($b0,4,4);
$hex64[]=substr($b0,8,4);
$hex64[]=substr($b0,12,4);
$width=$dim[0];
$height=$dim[1];
foreach($hex64 as $hex16){
$dec=hexdec($hex16);
$divide=65536;
$mod=$dec%$divide;
$result=$dec/$divide;
$cordinate1=$result*$width;
$cordinate2=$result*$height;
echo "Remainder 1 : ".$mod." ; Result 1 : ".$result."<br/>CO-ORDINATES : <B>".$cordinate1." ".$cordinate2."</B><br/>";
}
?>
输出
余数 1:49551;结果 1:0.75608825683594 坐标:371.99542236328 396.94633483887 余数 1:19598;结果 1:0.29904174804688 坐标:147.12854003906 156.99691772461 余数 1:62471;结果 1:0.95323181152344 坐标:468.99005126953 500.4467010498 余数 1:34078;结果 1:0.51998901367188 坐标:255.83459472656 272.99423217773
所以我也有坐标,@Nirmal 已经展示了如何裁剪它们。现在接下来的步骤是解析 picasa.ini 中的十六进制代码和文件名并集成代码。Picasa 目前不通过 api(或它们吗?)提供十六进制代码。如果是这样的话,情况会更好。
所以我们正在接近解决方案。谢谢大家,我希望我能将赏金奖励给每个人(我不能,但不要害怕,注意你们的代表人数激增!)