|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
Побитовые операции с памятью16.03.2020, 18:01. Показов 12637. Ответов 150
Метки нет (Все метки)
Есть ли в Delphi какие-нибудь функции чтобы побитово сделать and or xor not с двумя произвольными кусками памяти? Можно чтобы это были обязательно два равных по длине куска, неважно.
Например для сравнения двух кусков есть очень быстрая функция CompareMem.
0
|
|
| 16.03.2020, 18:01 | |
|
Ответы с готовыми решениями:
150
Побитовые операции Побитовые операции побитовые операции |
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
|
| 27.03.2020, 20:07 | |
|
В общем написал поиск картинки с альфа-каналом на AVX-512 (пока только для картинок с шириной кратной 16 пикселям). Для Delphi 7 после компиляции asm-файла FASM`ом нужно конвертнуть получившийся coff в omf (я использовал obhconv с ключом -fomf). Мой процессор не поддерживает AVX-512, тестировал через SDE.
Для корректной работы битмапы должны быть 32-битными (0-прозрачный цвет, 255 - непрозрачный, других значений быть не должно). Ширина сэмпла должна быть кратна 16 рикселям. Рабочая демка для Delphi 7 во вложении.
0
|
|
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 04:13 [ТС] | |
|
murderer, При попытке вызова функции вылазит ошибка EExternalExeption C000001D. Я проделал всё шаги ещё раз, то есть скомпилил фасмом и конвертнул, но результат тот же самый. Попытался на RAD Studio 10.1 скомпилить, тоже самое. Мой получается тоже не поддерживает AVX-512?
Добавлено через 5 минут В CPU-Z например просто AVX.
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
|
| 28.03.2020, 05:31 | |
|
Не поддерживает. Просто AVX довольно бесполезная штука, для поиска картинок нужен хотя бы AVX2. Сейчас перепишу на SSE2.
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
|
| 28.03.2020, 06:31 | |
|
Вот вариант на SSE2, попутно исправил баг, который проявлялся при задании прямоугольника поиска (x,y,dx,dy). Ширина сэмпла должна быть кратна 4 пикселям.
1
|
|
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 07:27 [ТС] | |
|
Спасибо. А нужны обязательно 32битные битмапы? Недостаточно после загрузки сделать Src.PixelFormat:=pf32bit; Sample.PixelFormat:=pf32bit; ? Попробовал свои картинки - не ищет. Перегнал фотошопом в 32 бит - всё равно не находит. Ну, или как вариант находит но не там)
0
|
|
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
||||||
| 28.03.2020, 07:33 [ТС] | ||||||
Битмап всегда выровнен так, чтобы количество байт в сканлайне было равным четырём. Я когда-то выдирал и конвертировал разные иконки, и писал функции для считывания всех включая палитровые.
0
|
||||||
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
||
| 28.03.2020, 07:58 | ||
|
Альфа канал в целевом изображении должен быть забит числом $FF. В сэмпле альфа должна принимать только два значения: 0 - прозрачный, 255 - не прозрачный.
Добавлено через 2 минуты
1
|
||
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 08:15 [ТС] | |
|
murderer, Ого, огромное спасибо. Твой код отрабатывает мгновенно. Реально за 1мсек) У меня альфаканал у скриншота забивается $FF намного дольше)
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
||||||
| 28.03.2020, 08:15 | ||||||
|
Вот как можно быстро заполнить альфа-канал (обрати внимание я не использую сканлайны):
0
|
||||||
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 08:18 [ТС] | |
|
murderer, А делать GetObject обязательно, если я использую не TImage а TBitmap?
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
||||||
| 28.03.2020, 08:26 | ||||||
|
Можно получить указатель на растр так:
0
|
||||||
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 08:33 [ТС] | |
|
У меня почему-то в процессе AccessViolation выдаёт. Сейчас подумаю где ошибка.
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
|
| 28.03.2020, 08:40 | |
|
Может вылетать на инструкции movdqa если окажется, что растр сэмпла не выровнен по границе 16 байт. Тогда просто замени на movdqu.
0
|
|
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 08:47 [ТС] | |
|
Оно отрабатывает правильно, всё находит что надо, но почему-то на выходе из FormCreate вылетает если заполнять через bmp.bmBits.
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
||||||
| 28.03.2020, 08:49 | ||||||
|
Не забыл обнулить указатель?
0
|
||||||
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 08:55 [ТС] | |
|
О_о забыл, а что надо было?
Добавлено через 2 минуты Блин, это очень круто! Спасибо! А почему через bmp.bmBits работает быстрее в тысячу раз чем через сканлайны?
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
||||||
| 28.03.2020, 09:00 | ||||||
|
Тут я в комментах даже объяснил почему это обязательно - https://www.cyberforum.ru/post14373533.html
Добавлено через 4 минуты Дело даже не в сканлайнах, а в том, что ты постоянно вызываешь метод TBitmap.GetScanLine внутри цикла. Это нужно делать один раз перед циклом. Не важно как будет получен указатель, главное не делать лишних движений в цикле. Этот код будет работать наверное даже быстрее чем GetObject.
0
|
||||||
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 09:04 [ТС] | |
|
А альфаканал нужен только для выравнивания?
0
|
|
|
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
|
|
| 28.03.2020, 09:07 | |
|
По сути да. Это сильно упрощает код - можно просто сравнивать 4 пикселя через pcmpeqd.
0
|
|
|
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
|
|
| 28.03.2020, 09:08 [ТС] | |
|
А какого цвета цвет прозрачности у кота? У меня с фуксией не ищет(
0
|
|
| 28.03.2020, 09:08 | |
|
Побитовые операции Побитовые операции Побитовые операции Побитовые операции
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|