我经历过以下相关问题:
但我没有得到答案可能是因为我不理解64位或16位值。
我在Picasa和脸部检测上发布了一个问题,使用Picasa所做的脸部检测来从包含许多照片的照片中获取个人照片。 Automatic Face detection using API
an answer @Joel Martinez与picasa help上的答案相关联,其中说:
rect64()中包含的数字是64位十六进制数。
- 将其分成四个16位数字。
- 将每个除以最大无符号16位数(65535),你将有四个 0到1之间的数字。
全文
@oedious写道: - 这将是 有点技术,所以坚持下去。 * rect64()中包含的数字是64位 十六进制数。 *打破它 分为四个16位数字。 *划分 每个由最大无符号16位 数字(65535),你将有四个 数字介于0和1之间。*四 剩下的数字给你相对 面部矩形的坐标: (左,上,右,下)。 * 如果你 想要以绝对的方式结束 坐标,多个左边和 右边是图像宽度和顶部 和图像高度的底部。
示例picasa.ini文件:
[1.jpg]
backuphash=65527
faces=rect64(5520c092dfb2f8d),615eec1bb18bdec5;rect64(dcc2ccf1fd63e93e),bc209d92a3388dc3;rect64(52524b7c785e6cf6),242908faa5044cb3
crop=rect64(0)
如何从64位十六进制中获取4个数字?
对不起人,目前我不明白答案。我想我必须学习一些C ++(我是一名PHP和Java Web开发人员,数学上有弱点),然后才能跳进去编写一些东西,在一些坐标的帮助下将图像切割成多个图像。我也在研究CodeLab和creating plugins for Paint.net
答案 0 :(得分:7)
如果你想要基础知识,请说你有这个十六进制数字:
4444333322221111
我们将它分成纸上的4个部分,所以剩下的就是提取它们。这涉及使用ffff
掩码来阻止除了我们的数字之外的所有其他内容(f
屏蔽任何内容,0
屏蔽所有内容)并在每个部分上滑动它。所以我们有:
part 1: 4444333322221111 & ffff = 1111
part 2: 4444333322221111 & ffff0000 = 22220000
part 3: 4444333322221111 & ffff00000000 = 333300000000
part 4: 4444333322221111 & ffff000000000000 = 4444000000000000
剩下的就是删除最后的0。总而言之,在C中,你会把它写成:
int GetPart(int64 pack, int n) // where you define int64 as whatever your platform uses
{ // __int64 in msvc
return (pack & (0xffff << (16*n)) >> (16*n);
}
所以基本上,你计算掩码为0xffff(2个字节)移动到右边16 * n位(第一个为0,第二个为16,第三个为32,第四个为48),应用于除了我们感兴趣的部分之外的所有数字,然后将结果移回16 * n位以清除那些0的结尾。
一些额外的阅读:Bitwise operators in C。
希望有所帮助!
答案 1 :(得分:1)
这取决于您的编程语言 - 在C#中,即您可以使用BitConverter
类,它允许您根据字节数组中的字节位置提取数字。
UInt64 largeHexNumber = 420404334;
byte[] hexData = BitConverter.GetBytes(largeHexNumber);
UInt16 firstValue = BitConverter.ToUInt16(hexData, 0);
UInt16 secondValue = BitConverter.ToUInt16(hexData, 2);
UInt16 thirdValue = BitConverter.ToUInt16(hexData, 4);
UInt16 forthValue = BitConverter.ToUInt16(hexData, 6);
答案 2 :(得分:1)
这取决于语言。对于C语言系列,可以这样做(在C#中):
UInt64 number = 0x4444333322221111;
//to get the ones, use a mask
// 0x4444333322221111
const UInt64 mask1 = 0xFFFF;
UInt16 part1 = (UInt16)(number & mask1);
//to get the twos, use a mask then shift
// 0x4444333322221111
const UInt64 mask2 = 0xFFFF0000;
UInt16 part2 = (UInt16)((number & mask2) >> 16);
//etc.
// 0x4444333322221111
const UInt64 mask3 = 0xFFFF00000000;
UInt16 part3 = (UInt16)((number & mask3) >> 32);
// 0x4444333322221111
const UInt64 mask4 = 0xFFFF000000000000;
UInt16 part4 = (UInt16)((number & mask4) >> 48);
答案 3 :(得分:1)
我认为您被要求做的是获取您拥有的64位数据并将其视为4个16位整数。从那里开始,您将获取16位值并将其转换为百分比。当与图像高度/宽度相乘时,这些百分比为您提供4个坐标。
如何执行此操作取决于您编程的语言。
答案 4 :(得分:1)
以下是算法:
除以0x10000(65536)的余数将为您提供第一个数字。
取结果然后再次除以0x10000(65536),余数将给你第二个数字。
再次将结果除以0x10000(65536),余数将给出第三个数字。
结果是第四个数字。
答案 5 :(得分:0)
我需要从picasa.ini文件转换crop = rect64()值。 我用以上信息创建了以下ruby方法。
def coordinates(hex_num)
[
hex_num.divmod(65536)[1],
hex_num.divmod(65536)[0].divmod(65536)[1],
hex_num.divmod(65536)[0].divmod(65536)[0].divmod(65536)[1],
hex_num.divmod(65536)[0].divmod(65536)[0].divmod(65536)[0].divmod(65536)[1]
].reverse
end
它有效,但我需要在数组上添加.reverse方法以获得所需的结果。