(类似的问题已经在superuser上提出,涉及应用程序的答案。这里发布此问题是为了收集相同的可编程解决方案)
在我的工作场所,护照大小的照片被一起扫描,然后被切成单独的图片并保存为带有唯一文件号的文件。目前我们使用Paint.net手动选择、剪切和保存图片。
样本扫描文档 Picasa 截图: (来源:谷歌图像搜索多个来源,合理使用)
SAMPLE.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提供十六进制代码(或他们会吗?)。如果是这样,情况将会更好。
所以我们接近解决方案。谢谢大家,我希望能把奖励颁发给每个人(我不能,但不要担心,注意你的声望的增长!)
(x,y)
格式给出所有四个角落的最终坐标吗? - Nirmal