Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2010, 00:01   #1
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию Работа с TBitMap.

Вот стал разбираться в графике и возникли трудности.
Цитата:
var Mbm:TBitmap;
begin
Mbm:=Image1.Picture.Bitmap;
end;
Вот этим кодом можно загрузить картинку в Bitmap(как я понял это массив пикселей и их цветов).
Цитата:
Image1.Picture.Bitmap.Assign(mbm);
Этим вывести.
А дальше хочется начать с ним работать...
Знаю что у TBitmap есть свойство ScanLine, которое возвращает линию пикселей из Bitmap. Научите как с ним можно обращаться. Например выделить из битмап первые n линий и вывести. Или обращаться к любому пикселю в линии. Во что можно помещать набор линий?
Если всё откладывать на потом, то потом будет всё.

Последний раз редактировалось Herly; 05.01.2010 в 00:22.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 11:42   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
var Mbm:TBitmap;
begin
Mbm:=Image1.Picture.Bitmap;
end;
Вы приказываете объекту, которого не существует.
Код:
Var
 Bit:TBitMap;
Begin
 Bit:=TBitMap.Create;
 Bit.Assign(...);
 ...
 Image1.Canvas.Draw(X,Y,Bit);
 ...
 Bit.Free;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.01.2010, 12:45   #3
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Код:
var Mbm:TBitmap;
begin
Mbm:=Image1.Picture.Bitmap;
end;
Вы приказываете объекту, которого не существует.
Код:
Var
 Bit:TBitMap;
Begin
 Bit:=TBitMap.Create;
 Bit.Assign(...);
 ...
 Image1.Canvas.Draw(X,Y,Bit);
 ...
 Bit.Free;
Но мой код ввода и вывода работает... Я же объявил переменную, значит место для него есть. Затем сразу кидаю в него изображение с Image1.
Для проверки попробовал вывести в другой Image и всё выводится совершенно эдентично.
Мне хотелось бы узнать про то как работать со ScanLine...
Цитата:
var Mbm:TBitmap;
begin
Mbm:=Pimg1.Picture.Bitmap;
Image1.Picture.Bitmap.Assign(mbm);
end;
Если всё откладывать на потом, то потом будет всё.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 12:54   #4
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
Мне хотелось бы узнать про то как работать со ScanLine...
может поможет
Цитата:
Исходник программы, показывающей пример создания модуля для операций с графикой: рисование прозрачного текста (в том числе и под углом), наложение битмапа с прозрачностью / по маске, поворот изображения, несколько процедур с изменением палитры (сепия, ЧБ, яркость, отдельно по каналам (RGB)). Почти все реализовано через Scanline, без использования GDI+, поэтому работает достаточно шустро - Автор Naumenko Anton aka Antonn.
Вложения
Тип файла: zip scanline-demo.zip (204.4 Кб, 58 просмотров)
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 05.01.2010, 13:18   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
(как я понял это массив пикселей и их цветов).
Цитата:
Я же объявил переменную, значит место для него есть
Великое заблуждение - написать в Var и считать, что на этом закончилось. TBitMap - не тип, это КЛАСС! А любой класс перед использованием необходимо создать и структурировать. Показываю на пальцах:
Код:
...101010100101101001001001001001...
- Это Вы объявили переменную, получили её адрес.
Код:
...101010100101101001001001001001
Пытаетесь действовать с ней как с классом (изменяете какое-либо свойство класса). Машина не структурировала данные, поэтому не знает, что её делать.
Код:
Bit:=TBitMap.Create
Код:
...1010 10 1001 01 1010 01 0010 01 0010 01...
Условно можно это изобразить так. Данные структурированы, и машина знает, куда её что рисовать.
P.S. И не забываем вернуть все как было при помощи Free.

P.P.S. Насчет того, что Ваш код работает - объяснение проще простого -
Код:
Mbm:=Image1.Picture.Bitmap;
- Вы делаете присваивание, т.е. получаете не только данные, но и структуру. Одно "Но"! Хендл битмапа у Mbm будет такой же как и у Image1.Picture.Bitmap. Я уже на это попадал и когда будете менять что-то Image1.Picture.Bitmap.Handle, изменения скажутся на Mbm!
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.01.2010, 13:24   #6
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Alex Cones Поясните пожалуйста что такое Handle.
И можно ли присваивать картинку в битмап вот так?
Цитата:
var Mbm:TBitmap;
begin
Mbm.Create;
Mbm:=Pimg1.Picture.Bitmap;
Pimg1.Picture.Bitmap.Assign(mbm);
Mbm.Free;
end;
Если всё откладывать на потом, то потом будет всё.

Последний раз редактировалось Herly; 05.01.2010 в 13:29.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 13:27   #7
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

вот про handle
Цитата:
В системе существует множество разнотипных объектов, существованием которых управляет система,
которая предоставляет всевозможные интерфейсы для работы с ними прикладной программе с помощью
Win32 API. Чтобы прикладная программа могла как-то идентифицировать тот или иной объект,
с которым она работает посредством системных вызовов. Для этого вводится хэндл (HANDLE), который решает эту задачу -
он по сути является уникальным идентификатором (в общем-то, хэндл - 32-битное беззнековое число).
Кроме того, в некоторых системных вызовах могут фигурировать только объекты определённого типа (HBRUSH,
HPEN, HWND, HFILE, HMEM,...),
а в некоторых - более широкие классы объектов, в том числе есть функции, которые могут работать с любыми
объектами. Поэтому существуют различные типы хэндлов (которые на самом деле те же самые хэндлы,
только называются по-разному). Таким образом, всевозможные хэндлы образуют иерархию наследования
с одним базовым классом - HANDLE. Фактически, эмулируется ОО-система посредством процедурного
API, что позволяет использовать не-ОО-языки для написания прикладных программ под ОО-систему Windows.

Перевести это слово можно в данном контексте как дескриптор (соответствующего объекта), идентификатор, хэндл
.
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 05.01.2010, 13:30   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Если перевести на русский язык, то :
область данных находится в комнате, а хендл это ручка от двери чтобы ее открыть (вольный перевод с древнеMSDNского).
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.01.2010, 13:32   #9
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

А вот пишу как вы сказали и выдаёт ошибочку(
Цитата:
var Mbm:TBitmap;
begin
Mbm.Create;
Mbm.Assign(Pimg1.Picture.Bitmap);
Pimg1.Canvas.Draw(0,0,Mbm);
Mbm.Free;
end;
Если всё откладывать на потом, то потом будет всё.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 13:32   #10
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
а хендл это ручка
Скорее ключ от нужной
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с TBitmap QunneD Общие вопросы Delphi 2 21.11.2009 18:32
ImageList + TBitMap = ... Alex Cones Мультимедиа в Delphi 4 08.07.2009 14:00
TBitmap и указатели Levsha100 Общие вопросы C/C++ 3 17.05.2009 22:36
движение TBitMap Juffin Мультимедиа в Delphi 1 14.04.2009 21:34
TBitmap odi_noki Мультимедиа в Delphi 17 25.10.2008 09:53