Хорошо, я был не слишком далек от того, чего хотел достичь. Для тех, кто сюда доберется, я выкладываю свое решение проблемы. Короче говоря, мое отображение было неправильным, так как я использовал текст полей для:
после обновления моего сопоставления и установки типа поля на «ключевое слово» все стало еще более перспективным. Я решил переделать свой запрос и найти точные совпадения в этих полях, используя термин. Затем выяснилось, что точные совпадения должны быть слегка увеличены. После внесения дополнительных косметических изменений, окончательное отображение выглядит следующим образом:
$params = [
'index' => $index,
'body' => [
'settings' => [
'analysis' => [
'analyzer' => [
'autocomplete' => [
'tokenizer' => 'autocomplete',
'filter' => [
'lowercase'
]
],
'autocomplete_search' => [
'tokenizer' => 'lowercase'
]
],
'tokenizer' => [
'autocomplete' => [
'type' => 'edge_ngram',
'min_gram' => 1,
'max_gram' => 50,
'token_chars' => [
'letter',
]
]
]
]
],
'mappings' => [
'_doc' => [
'properties' => [
'id' => [
'type' => 'keyword'
],
'sku' => [
'type' => 'keyword',
],
'attr_set_name' => [
'type' => 'keyword',
],
'name_search' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'autocomplete_search'
],
'attributes' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'autocomplete_search'
],
'super_attr' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'autocomplete_search'
],
'price' => [
'type' => 'float'
]
]
]
]
]
];
и запрос, который хорошо работает с этим:
$params = [
'index' => $index,
'size' => $hits,
'type' => '_doc',
'body' => [
"query" => [
"bool" => [
'should' => [
['match' => [
'name_search' => [
'query' => $phrase,
'operator' => 'and',
'boost' => 4,
]
]],
['match' => [
'name_search' => [
'query' => $phrase,
'operator' => 'or',
'fuzziness' => '1',
'boost' => 2,
]
]],
['match' => ['attr_set_name' => $phrase]],
['match' => [
'super_attr' => [
'query' => $phrase,
'boost' => 7,
]
]],
['match' => ['attributes' => $phrase]],
['term' => [
'sku' => [
'value' => $phrase,
"boost" => 5.0
]
]],
['term' => [
'id' => [
'value' => $phrase,
"boost" => 5.0
]
]],
],
"filter" => [
"range" => [
"price" => [
"gte" => $min,
"lte" => $max,
"boost" => 2.0
]
]
],
"minimum_should_match" => 2,
],
]
]
];
Я надеюсь, что однажды это кому-нибудь поможет: D [ 118]
Путем я обычно делаю это через DIBSection - независимый от устройств битовый массив, из которого можно изменить пиксели непосредственно. К сожалению, нет никакой поддержки MFC DIBSections: необходимо использовать функцию Win32 CreateDIBSection () для использования его.
Запустите путем загрузки битового массива как 32-разрядного RGBA (то есть, четыре байта на пиксель: один красный, один зеленый, один синий цвет и один для альфа-канала). В управлении создайте соответственно размерный DIBSection. Затем в стандартной программе краски
Можно создать маску, учитывая необработанные растровые данные просто путем рассмотрения значений альфа-канала - я не уверен, что Вы спрашиваете здесь.
Необходимо сделать альфа-смешение с цветом фона, затем вынуть альфа-канал для рисования его к управлению.
Альфа-канал должен просто быть каждым 4-м байтом Вашего изображения. Можно использовать это непосредственно для маски, или можно просто скопировать каждый 4-й байт в новый рисунок маски.
Закрасить его очень просто с помощью функции AlphaBlend.
Что касается маски, вам нужно получить биты растрового изображения и исследовать байт альфа-канала для каждого интересующего вас пикселя.
Оптимизированный способ предварительно умножить каналы RGB с альфа-каналом состоит в том, чтобы настроить [256] [256] массив, содержащий расчетные результаты умножения. Первый размер является альфа-значением, вторым является значение R/G/B, значения в массиве являются предварительно умноженными значениями, в которых Вы нуждаетесь.
С этим массивом, настроенным правильно, можно вычислить значение, в котором Вы нуждаетесь как это:
R = multiplicationLookup[alpha][R];
G = multiplicationLookup[alpha][G];
B = multiplicationLookup[alpha][B];
Вы на правильном пути, но должны починить две вещи.
Первое использование:: LoadImage (.. LR_CREATEDIBSECTION..) вместо CBitmap:: LoadBitmap. Два, необходимо "предварительно умножить" значения RGB каждого пикселя в битовом массиве к их соответствующему значение. Это - требование функции AlphaBlend, см. описание AlphaFormat на этой странице MSDN. T
lpng имеет рабочий код, который делает умножение в обратном порядке данных DIB.