Получите четыре 16-битных числа из 64-битного шестнадцатеричного значения - PullRequest
1 голос
/ 08 октября 2010

Я прошел через эти вопросы:

Но я не получил ответа, вероятно, потому что я не понимаю 64-битные или 16-битные значения.

Я опубликовал вопрос о Picasa и распознавании лиц, чтобы использовать распознавание лиц, которое Picasa делает, чтобы получать отдельные фотографии из фотографии, содержащей много изображений. Автоматическое распознавание лиц с использованием API

В ответ @ Джоэл Мартинес , связанный с ответом на справку Picasa , в котором сказано:

Число, заключенное в rect64 (), представляет собой шестнадцатеричное 64-разрядное число.

  • Разбейте это на четыре 16-битных числа.
  • Разделите каждое на максимальное число без знака 16-разрядное (65535), и у вас будет четыре цифры от 0 до 1.

полный текст

@ oedious писал: - Это будет несколько технический, так что держись. * The число, заключенное в 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)

Как мне получить 4 числа из 64-битного шестнадцатеричного числа?

Простите, в настоящее время я не понимаю ответы. Я предполагаю, что мне придется выучить немного C ++ (я - веб-разработчик на PHP и Java, у которого есть слабые места в математике), прежде чем я смогу перейти и написать что-то, что разделит изображение на несколько изображений с помощью некоторых координат. Я изучаю CodeLab и создание плагинов для Paint.net тоже

Ответы [ 6 ]

7 голосов
/ 08 октября 2010

Если вам нужны основы, скажите, что у вас есть шестнадцатеричное число:

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 для 2-го, 32 для 3-го и 48 для 4-го), примените его к числу, чтобы замаскировать все, кроме интересующей нас части, затем сдвиньте результат обратно на 16 * n бит, чтобы очистить эти 0 вконец.

Некоторое дополнительное чтение: Битовые операторы в C .

Надеюсь, это поможет!

1 голос
/ 08 октября 2010

Вот алгоритм:

Остальная часть деления на 0x10000 (65536) даст вам первое число.

Возьмите результат, затем разделите на 0x10000 (65536) снова, остаток даст вам второе число.

Возьмите результат деления на 0x10000 (65536) снова, остаток даст вам третье число.

Результат - четвертое число.

1 голос
/ 08 октября 2010

Я думаю, что вас просят сделать это - взять 64-битные данные, которые у вас есть, и обработать их как 4 16-битных целых числа. Оттуда вы берете 16-битные значения и конвертируете их в проценты. Эти проценты при умножении на высоту / ширину изображения дают 4 координаты.

Как вы это сделаете, зависит от языка, на котором вы программируете.

1 голос
/ 08 октября 2010

Это зависит от языка. Для языков семейства 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);
1 голос
/ 08 октября 2010

Это зависит от вашего языка программирования - в 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);
0 голосов
/ 24 декабря 2011

Мне нужно было преобразовать значения crop = rect64 () из файла picasa.ini.Я создал следующий метод 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 в массив для достижения желаемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...