![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Ребята, мне надо инвертировать часть изображения. Какие есть пути решения пограмотней?
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 4 Всего: 19 |
Если просто прямоугольником от координаты (x1, y1) до (x2, y2), то можно скопировать часть изображения на отдельный битмап, и там уже его инвертировать, а решений есть много одно из них вы с легкостью найдёте в DRKB или Delphiworld
-------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Спасибо. Это на поверхности конечно. А без создания отдельного BitMap?
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
пробегаешь по канвасу (если оно есть) или по пикселям битмапа (если он есть) сканлайном, достаешь каналы пикселя (GetRvalue() например, у сканлайна они уже готовые), отнимаешь их от 255 и записываешь обратно
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Зачем сканлайн? Это долго.
Да и смысл изобретать велосипед, когда всё уже готово. И да, можно без второго битмапа. И всего в одну строку. Допустим, нужно инвертировать прямоугольную область x100:y50, шириной 200:100
|
|||
|
||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 16 Всего: 54 |
Это сообщение отредактировал(а) Frees - 23.6.2010, 12:35 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Спасибо. Но пока не вышло. Имею Image на форме. При нажатии на кнопку должен инвертироваться прямоугольник.
Координаты верхней точки прямоугольника 0, 0. ширина 128, высота 83. Пробовал
Ноль внимания. Добавлено через 1 минуту и 9 секунд Frees, спасибо, сейчас еще ваш пример попробую. Добавлено через 6 минут и 26 секунд Frees, Ваше работает однако. А что за метод: CopyMode? И что такое cmSrcCopy; -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Правильно. Код только инвертирует изображение. Но не рисует его.
В случае с имаджем, нужно его обновить.
CopyMode - последний параметр в BitBlt. cmDstInvert в CopyRect - то же самое, что и DSTINVERT в BitBlt. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Snowy, Сенкс, воспользовался BitBlit.
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
Snowy,
долго для чего? |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
AntonN, Если сканлайнить то надо строки изображения циклом проходить, как я понял...
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Заметил любопытнейшую вещь.
Если ДО вызова функции BitBlt выполнить в Image загрузку изображения из какого либо файла, действие функции отображается несмотря на отсутствие refresh. То есть
Визуально аналогично следующему:
Как и почему так получается не разобрался. Да картинка вроде обновляется из за загрузки. Но она же обновляется до операции BitBlt Это сообщение отредактировал(а) PsiMagistr - 23.6.2010, 16:30 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
||||
|
|||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Скорее всего оно перерисовывается сообщением, которое обрабатывается после того как исполнится весь код и будет выполняться обработчик сообщений.
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Mikel, Шут его знает дружище, вот например погляди:
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Просто пытаюсь понятькак работает функция.
Все интересней и интересней. Есть два Image. ImgMap, ImLocation. В ImgLocation есть некое стартовое изображение по умолчанию. Мы берем ImMap, и копируем оттуда кусочек в ImgLocation. Копировать надо с инвертированием. Итак:
Это сообщение отредактировал(а) PsiMagistr - 24.6.2010, 08:51 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Ну да, скорее всего если вместо ImgLocation.Canvas.CopyRect(R1, ImgMap.Canvas, R2); будешь работать не с канвами самого image, а с bitmap.canvas, то не перерисуется
![]() Работает- оставь и не трогай ![]() -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Гм. Ничего не понял. Как инверт-режим может мешать правильному копированию участка?
Это сообщение отредактировал(а) PsiMagistr - 24.6.2010, 09:00 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Как будто точно от режима зависит. странно.
При попытке просто копировать участок изображения в другой Image
Как по маслу. При попытке изменить режим на DstInvert, чтобы :
Не происходит копирования участка. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
||||
|
|||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
|
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Спасибо большое. Только долго.
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Сам рефреш не перерисовывает, а только даёт запрос в очередь сообщений, что нужно перерисовать. Он отработает тогда, когда приложением будет получено сообщение на перерисовку. А оно не будет получено, пока мы не отпустим тред. Если между коммандами вставить Application.ProcessMessages, то он выполнит очередь сообщений и только потом будет инфертирование. Как только мы закончим, очередь сообщений будет обработана, запрос отрисовки будет выполнен. Ну так я сразу так и сказал... |
|||
|
||||
AntonN |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
PsiMagistr,
Долго? для чего долго? Добавлено через 2 минуты и 11 секунд 1000 инвертирований за 0,6 секунды областей 250*250 - это долго? Добавлено через 5 минут и 7 секунд небольшое изменение...
и те же 1000 инвертов улетают за 0,18 секунды, это 5555 операций в секунду? ты ничего с "долго" не перепутал? |
||||
|
|||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Не перепутал дружище. Если есть функция инвертирования, то зачем изобретение велосипеда?)
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
сканлайн оказался быстрее на 20% (глубина цветности дисплея 32 бита). "Долго"... Это еще без оптимизации до асма, пара xor+add с такой скоростью улетят, что моргнуть не успеем... |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
PsiMagistr,
я и вжу как она есть, уже второй день не можешь ее победить ![]() а потом вдруг тебе понадобится серпия, crayscale, еще что нибудь - тоже готовое будешь искать? ![]() |
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Я не понял что ты хочешь, но попробуй так: )))
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
С позволения, я еще пофлужу...
накидал на скорую руку, выполняется при тех же параметрах из моего предшествующего поста за 0.3 секунды, это чуть больше чем в 2.5 раза быстрее BitBlt() хотя вероятно где-то есть корявки, удивлен что BitBlt() в этом режиме показывает такие низкие результаты... |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Для точности эксперимента увеличил до 10000 инверсий.
Результат на моем ноуте: InvertRect_GDI - 40 секунд BitBlt - 13 секунд Итог: Битблит в 3 раза быстрее |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
У меня просто проц не слабый. С последней функцией можешь сравнить? просто интересно
|
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Спасибо большое. Уже ассемблерные вставки появились.
![]() -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Ребята, все. Уф-ф-ф. Спасибо всем. Причина: У меня картинка не очень чистая была. На глаз нипочем не заметно. А при инвертировании - пятна моментом.
Добавлено через 2 минуты и 39 секунд Ребята, все. Уф-ф-ф. Спасибо всем. Причина: У меня картинка не очень чистая была. На глаз нипочем не заметно. А при инвертировании - пятна моментом. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |