Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инвертировать часть изображения 
:(
    Опции темы
PsiMagistr
Дата 23.6.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Ребята, мне надо инвертировать часть изображения. Какие есть пути решения пограмотней?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
DarkProg
Дата 23.6.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Если просто прямоугольником от координаты (x1, y1) до (x2, y2), то можно скопировать часть изображения на отдельный битмап, и там уже его инвертировать, а решений есть много одно из них вы с легкостью найдёте в DRKB или Delphiworld


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
PsiMagistr
Дата 23.6.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Спасибо. Это на поверхности конечно. А без создания отдельного BitMap?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
AntonN
Дата 23.6.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



пробегаешь по канвасу (если оно есть) или по пикселям битмапа (если он есть) сканлайном, достаешь каналы пикселя (GetRvalue() например, у сканлайна они уже готовые), отнимаешь их от 255 и записываешь обратно


--------------------
user posted image
PM MAIL WWW   Вверх
Snowy
Дата 23.6.2010, 12:19 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Зачем сканлайн? Это долго.
Да и смысл изобретать велосипед, когда всё уже готово.
И да, можно без второго битмапа. И всего в одну строку.

Допустим, нужно инвертировать прямоугольную область x100:y50, шириной 200:100
Код
  BitBlt(bmp.Canvas.Handle, 100, 50, 200, 100, bmp.Canvas.Handle, 100, 50, DSTINVERT);
DSTINVERT говорит, что мы просто хотим инвертировать фрагмент исходного изображения.
PM MAIL   Вверх
Frees
Дата 23.6.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Код

var
  r: TRect;
begin
  Image1.Picture.Bitmap.Canvas.CopyMode := cmDstInvert;
  r := Rect(10,10,100,100);
  Image1.Picture.Bitmap.Canvas.CopyRect(r, Image1.Picture.Bitmap.Canvas, r);
  Image1.Picture.Bitmap.Canvas.CopyMode := cmSrcCopy;


Это сообщение отредактировал(а) Frees - 23.6.2010, 12:35


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
PsiMagistr
Дата 23.6.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Спасибо. Но пока не вышло. Имею Image на форме. При нажатии на кнопку должен инвертироваться прямоугольник.

Координаты верхней точки прямоугольника 0, 0.

ширина 128, высота 83.

Пробовал 

Код

BitBlt(Im.Picture.Bitmap.Canvas.Handle, 0, 0, 128, 83, Im.Picture.Bitmap.Canvas.Handle, 128, 83, DSTINVERT);


Ноль внимания.

Добавлено через 1 минуту и 9 секунд
Frees,  спасибо, сейчас еще ваш пример попробую.

Добавлено через 6 минут и 26 секунд
Frees,  Ваше работает однако. 

А что за метод: CopyMode? И что такое  cmSrcCopy; 


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Snowy
Дата 23.6.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(PsiMagistr @  23.6.2010,  12:42 Найти цитируемый пост)
Ноль внимания.
Правильно. Код только инвертирует изображение. Но не рисует его.
В случае с имаджем, нужно его обновить.
Код
  BitBlt(Im.Picture.Bitmap.Canvas.Handle, 0, 0, 128, 83, Im.Picture.Bitmap.Canvas.Handle, 0, 0, DSTINVERT);
  Im.Refresh;


Цитата(PsiMagistr @  23.6.2010,  12:42 Найти цитируемый пост)
А что за метод: CopyMode? И что такое  cmSrcCopy; 
CopyMode - последний параметр в BitBlt.
cmDstInvert в CopyRect - то же самое, что и DSTINVERT в BitBlt.
PM MAIL   Вверх
PsiMagistr
Дата 23.6.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Snowy,  Сенкс, воспользовался BitBlit.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
AntonN
Дата 23.6.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Snowy
Цитата

Зачем сканлайн? Это долго.

долго для чего?


--------------------
user posted image
PM MAIL WWW   Вверх
PsiMagistr
Дата 23.6.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



AntonN, Если сканлайнить то надо строки изображения циклом проходить, как я понял...


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 23.6.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Заметил любопытнейшую вещь.

Если ДО вызова функции  BitBlt выполнить в Image загрузку изображения из какого либо файла, действие функции отображается несмотря на отсутствие refresh.

То есть

Код

BitBlt(Im.Picture.Bitmap.Canvas.Handle, 0, 0, 128, 83, Im.Picture.Bitmap.Canvas.Handle, 0, 0, DSTINVERT);
Im.Refresh;


Визуально аналогично следующему:

Код

Im1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'Proba.bmp');
BitBlt(Im.Picture.Bitmap.Canvas.Handle, 0, 0, 128, 83, Im.Picture.Bitmap.Canvas.Handle, 0, 0, DSTINVERT);


Как и почему так получается не разобрался. Да картинка вроде обновляется из за загрузки. Но она же обновляется до операции BitBlt



Это сообщение отредактировал(а) PsiMagistr - 23.6.2010, 16:30


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Mikel
Дата 23.6.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: нет
Всего: 2



Скорее всего оно перерисовывается сообщением, которое обрабатывается после того как исполнится весь код и будет выполняться обработчик сообщений.


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
PsiMagistr
Дата 23.6.2010, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Mikel,  Шут его знает дружище, вот например погляди:

Код

procedure TfrmGame.ImgMapClick(Sender: TObject);
 var R1,R2:TRect; //Области копирования.
begin
 ImgMap.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'map.bmp'); //Грузим файл.
 ImgMap.Canvas.Brush.Style := bsClear; //Очищаем кисть
 ImgMap.Canvas.Pen.Color := clblue;
 ImgMap.Canvas.Rectangle(Lt1,Tp1,Lt2,Tp2);
 R1:=Rect(0,0,128,83); //Определяем область куда хотим копировать.
 R2:= Rect(Lt1,Tp1,Lt2,Tp2);  //Определяем область откуда хотим копировать.
 ImgLocation.Canvas.CopyRect(R1, ImgMap.Canvas, R2); //Рисуем нечто на изображении. А вот если здесь заккоментировать, для BitBlit понадобится рефреш в конце.
 BitBlt(ImgLocation.Picture.Bitmap.Canvas.Handle, 0, 0, 128, 83, ImgMap.Picture.Bitmap.Canvas.Handle, LT1, TP1, DSTINVERT); 

//BitBlt идет вообще последней командой. Однако рефрешить изображение не надо. Ибо мы рисовали на нем. 
end;





--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 24.6.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Просто пытаюсь понятькак работает функция. 

Все интересней и интересней. Есть два Image. ImgMap, ImLocation. В ImgLocation есть некое стартовое изображение по умолчанию.  Мы берем ImMap, и копируем оттуда кусочек в ImgLocation. Копировать надо с инвертированием.

Итак:

Код

procedure TfrmGame.ImgMapClick(Sender: TObject);
 var R1,R2:TRect; //Области копирования.
begin
 ImgMap.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'map.bmp'); //Грузим файл.
 ImgMap.Canvas.Brush.Style := bsClear; //Очищаем кисть
 ImgMap.Canvas.Pen.Color := clblue;
 ImgMap.Canvas.Rectangle(Lt1,Tp1,Lt2,Tp2);
 R1:=Rect(0,0,128,83); //Определяем область куда хотим копировать.
 R2:= Rect(Lt1,Tp1,Lt2,Tp2);  //Определяем область откуда хотим копировать.
 ImgLocation.Picture.Bitmap.Canvas.CopyMode := cmDstInvert; //Если убрать эту строку, само копирование нужных участков происходит нормально, но естесственно без инвертирования. Если добавить эту строку, будет постоянно инвертироваться (туда-сюда), не меняясь, стартовое изображение.
 ImgLocation.Canvas.CopyRect(R1, ImgMap.Canvas, R2);
 end;

//В причинах не разобрался. Но получается, что сам режим cmInvert мешает правильному копированию участка. Как такое быть может?





Это сообщение отредактировал(а) PsiMagistr - 24.6.2010, 08:51


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.