Как потянуть 32-разрядные битовые массивы альфа-канала?

Хорошо, я был не слишком далек от того, чего хотел достичь. Для тех, кто сюда доберется, я выкладываю свое решение проблемы. Короче говоря, мое отображение было неправильным, так как я использовал текст полей для:

  • id
  • sku
  • attr_set_name

после обновления моего сопоставления и установки типа поля на «ключевое слово» все стало еще более перспективным. Я решил переделать свой запрос и найти точные совпадения в этих полях, используя термин. Затем выяснилось, что точные совпадения должны быть слегка увеличены. После внесения дополнительных косметических изменений, окончательное отображение выглядит следующим образом:

        $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]

9
задан Javier De Pedro 22 November 2008 в 23:41
поделиться

5 ответов

Путем я обычно делаю это через DIBSection - независимый от устройств битовый массив, из которого можно изменить пиксели непосредственно. К сожалению, нет никакой поддержки MFC DIBSections: необходимо использовать функцию Win32 CreateDIBSection () для использования его.

Запустите путем загрузки битового массива как 32-разрядного RGBA (то есть, четыре байта на пиксель: один красный, один зеленый, один синий цвет и один для альфа-канала). В управлении создайте соответственно размерный DIBSection. Затем в стандартной программе краски

  • Скопируйте растровые данные в растровые данные DIBSECTION, с помощью байта альфа-канала для смешивания растрового изображения с цветом фона.
  • Создайте контекст устройства и выберите DIBSection в него.
  • Используйте BitBlt () для копирования от нового контекста устройства до контекста устройства краски.

Можно создать маску, учитывая необработанные растровые данные просто путем рассмотрения значений альфа-канала - я не уверен, что Вы спрашиваете здесь.

5
ответ дан 4 December 2019 в 11:44
поделиться

Необходимо сделать альфа-смешение с цветом фона, затем вынуть альфа-канал для рисования его к управлению.

Альфа-канал должен просто быть каждым 4-м байтом Вашего изображения. Можно использовать это непосредственно для маски, или можно просто скопировать каждый 4-й байт в новый рисунок маски.

1
ответ дан 4 December 2019 в 11:44
поделиться

Закрасить его очень просто с помощью функции AlphaBlend.

Что касается маски, вам нужно получить биты растрового изображения и исследовать байт альфа-канала для каждого интересующего вас пикселя.

1
ответ дан 4 December 2019 в 11:44
поделиться

Оптимизированный способ предварительно умножить каналы RGB с альфа-каналом состоит в том, чтобы настроить [256] [256] массив, содержащий расчетные результаты умножения. Первый размер является альфа-значением, вторым является значение R/G/B, значения в массиве являются предварительно умноженными значениями, в которых Вы нуждаетесь.

С этим массивом, настроенным правильно, можно вычислить значение, в котором Вы нуждаетесь как это:

R = multiplicationLookup[alpha][R];
G = multiplicationLookup[alpha][G];
B = multiplicationLookup[alpha][B];
1
ответ дан 4 December 2019 в 11:44
поделиться

Вы на правильном пути, но должны починить две вещи.

Первое использование:: LoadImage (.. LR_CREATEDIBSECTION..) вместо CBitmap:: LoadBitmap. Два, необходимо "предварительно умножить" значения RGB каждого пикселя в битовом массиве к их соответствующему значение. Это - требование функции AlphaBlend, см. описание AlphaFormat на этой странице MSDN. T

lpng имеет рабочий код, который делает умножение в обратном порядке данных DIB.

1
ответ дан 4 December 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: