Ниже приведены сведения о том, что Picasa хранит как хэш. Он хранит их, как это:Как отменить RectangleF на грань лица Picasa
faces=rect64(54391dc9b6a76c2b),4cd643f64b715489
[DSC_2289.jpg]
faces=rect64(1680000a5c26c82),76bc8d8d518750bc
Информация в Интернете говорит, что это:
Количество заключенное в rect64() представляет собой 64-разрядное шестнадцатеричное число.
- Перерыв на четыре 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 байта, включая точность, однако float в C# составляет 8 байтов, и даже битконвертер. ToSingle - 4 байта.
Любая помощь приветствуется.
EDIT: Вот то, что я прямо сейчас
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();
}
Как нет с плавающей точкой типа данных с 2-мя байтами (в C# http://www.techotopia.com/index.php/C_Sharp_Variables_and_Constants), вы можете попробовать преобразовать его в короткий вместо , Преобразование должно быть явным (http://msdn.microsoft.com/en-us/library/ybs77ex4%28VS.71%29.aspx), иначе компилятор выдаст ошибку. – keyboardP
Я тоже это пробовал, но мой хэш никуда не годится.Я отправляю свой код выше, чтобы увидеть, что я делаю что-то явно неправильно. – esac