다음은 Picasa가 해시로 저장하는 항목에 대한 세부 정보입니다. 그것은이처럼 저장 :RectangleF를 Picasa 얼굴 해시로 바꾸는 방법
rect64 쌌다 수는() 64 비트 16 진수입니다 : 웹
faces=rect64(54391dc9b6a76c2b),4cd643f64b715489
[DSC_2289.jpg]
faces=rect64(1680000a5c26c82),76bc8d8d518750bc
정보이 말했다.
- 4 개의 16 비트 숫자로 나눕니다.
- 최대 부호없는 16 비트 숫자 (65535)로 나누면 0과 1 사이에 네 개의 숫자가 나옵니다.
- 네 개의 숫자로 얼굴 사각형의 상대 좌표를 얻을 수 있습니다 : (왼쪽, 위, 오른쪽 , 하단).
- 절대 좌표로 끝내려면 왼쪽과 오른쪽을 이미지 너비로, 위쪽과 아래쪽을 이미지 높이로 곱하십시오.
지금 나는 RectangleF하고 난 다시 위에서 언급 한 해시로 돌려하려면 :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); }
그래서 RectangleF가 (만 상대 좌표를 유지) 잘 작동에 내 코드는 전원을 켭니다. 나는 이것을 알아낼 수 없다. picasa는 정밀도를 포함하여 2 바이트를 사용하지만 C#의 float는 8 바이트이고 BitConverter.ToSingle조차도 4 바이트입니다.
도움을 주시면 감사하겠습니다.
편집 : 여기에 내가 지금 무엇을 당신이과 같이 HashFromRectangle (RECT)에서 플로트 형식을 취할 필요 것 같습니다
public static string HashFromRectangle(RectangleCoordinates rect)
{
Console.WriteLine("{0} {1} {2} {3}", rect.Left, rect.Top, rect.Right, rect.Bottom);
UInt16 left = Convert.ToUInt16((float)rect.Left * 65535.0F);
UInt16 top = Convert.ToUInt16((float)rect.Top * 65535.0F);
UInt16 right = Convert.ToUInt16((float)rect.Right * 65535.0F);
UInt16 bottom = Convert.ToUInt16((float)rect.Bottom * 65535.0F);
byte[] lb = BitConverter.GetBytes(left);
byte[] tb = BitConverter.GetBytes(top);
byte[] rb = BitConverter.GetBytes(right);
byte[] bb = BitConverter.GetBytes(bottom);
byte[] barray = new byte[8];
barray[0] = lb[0];
barray[1] = lb[1];
barray[2] = tb[0];
barray[3] = tb[1];
barray[4] = rb[0];
barray[5] = rb[1];
barray[6] = bb[0];
barray[7] = bb[1];
return BitConverter.ToString(barray).Replace("-", "").ToLower();
}
, 당신은 대신 짧은으로 변환을 시도 할 수 . 변환이 명시 적이어야합니다 (http://msdn.microsoft.com/en-us/library/ybs77ex4%28VS.71%29.aspx). 그렇지 않으면 컴파일러에서 오류가 발생합니다. – keyboardP
나는 그것을 시도했지만, 내 해시가 같은 곳 근처에서 돌지 않고있다.위의 코드를 게시하여 내가 분명히 잘못된 것을하고 있는지 확인합니다. – esac