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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2013, 16:59   #1
Count of Toscany
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 13
Смущение Графический редактор. Некоторые трудности.

С программированием не очень дружу, так что некоторые мои вопросы могут показаться глупыми, за что наперёд извиняюсь.
Вообщем пишу графический редактор (пишу это громко сказано, скорее собираю исходные коды в кучу) и не совсем понимаю как сделать так, чтобы можно было рисовать не только на канве, но и на обычных картинках.
Компонент Image подходит в принципе, но при рисовании на картинках они мерцают. Если, не ошибаюсь нужна двойная буферизация. Так и не понял как её реализовать. Прошу код, если не тяжело, или же хотя бы объяснить сам алгоритм.
И ещё: так и не пойму, что лучше в моём случае (рисование на канве+ рисование на картинках) - Image или Paint Box?
Count of Toscany вне форума Ответить с цитированием
Старый 03.06.2013, 17:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я думаю что в твоем случае нужно рисовать на канве.
Причем канва эта должна быть созданна отдельно. Не Паинт бокс, не Имейдж, а просто канва в памяти. На нее загрузить изображение и на ней же и рисовать.
Тогда при перерисовке не будет мерцать - это и есть двойная фуферизация. когда сначала рисуется в памяти все, а потом скопом переносится на экран.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2013, 18:37   #3
Count of Toscany
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 13
По умолчанию

То есть, как я понимаю, рисовать на канве формы? Создать канву в памяти, а потом с неё выводить на канву формы?
Count of Toscany вне форума Ответить с цитированием
Старый 03.06.2013, 20:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да. Правильно понимаешь. Именно создать канву: Canv:=TCanvas.Create();
Вообще-то тебе стоит посмотреть примеры с созданием канвы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2013, 21:02   #5
Count of Toscany
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 13
По умолчанию

Но тогда возникает проблема с открытием и сохранением файлов, свойств LoadFromFile и SaveToFile нету просто. Так же не могу задать размер, Width и Height тоже нету. Может там что-то другое надо писать?
Count of Toscany вне форума Ответить с цитированием
Старый 03.06.2013, 21:10   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Есть Bitmap c LoadFromFile и SaveToFile. И есть BitBlt
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.06.2013, 21:39   #7
Count of Toscany
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 13
По умолчанию

Как мне тогда связать битмап с канвой? Не понимаю(( Алгоритм такой должен быть же:
1. Создать канву в памяти
2. Рисовать на ней
3. Выводить содержимое на форму.
И если надо - сохранять или открывать файлы. Канва этого делать не может, но битмап может. Значит содержимое должно в конечном результате находится в переменной типа Bitmap. Так это что, с канвы нужно срисовать ещё в битмап, а потом уже сохранять?
Count of Toscany вне форума Ответить с цитированием
Старый 03.06.2013, 22:25   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
3. Выводить содержимое на форму.
Выводить канву на битмап.
Связка может быть такой:
Код:
var b:TBitmap;Canvas:TCanvas;
...
 b.Width:=Canvas.Width;
 b.Height:=Canvas.Height;
 b.Canvas.Draw(0,0,Canvas);
 b.SaveToFile(...);
...
Где Canvas та самая канва.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.06.2013, 09:37   #9
Count of Toscany
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 13
По умолчанию

У меня свойств Width и Height для канвы просто нету.
Кстати, а можно объяснить почему лучше использовать именно канву, а не Имейдж. Просто у меня получилось сделать так, чтобы Image не мерцала. Вот так:
Код:
var 
bmp:Tbitmap;

procedure TForm1.open1Click(Sender: TObject);
begin
If OpenPictureDialog1.Execute then
bmp.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Width:=bmp.Width;
Image1.Height:=bmp.Height;
Image1.canvas.Draw(0,0,bmp);
end;
И можно рисовать сколько влезет. Но теперь новая проблема - не могу открыть Jpeg или GIF. Модуль Jpeg и для GIF подключил. Значит нужно создавать для каждого формата отдельную переменную его типа, и при анализе расширения загружать изображение в определённую переменную? А для GIF и Jpeg есть вообще переменные?

Последний раз редактировалось Stilet; 19.06.2013 в 15:42.
Count of Toscany вне форума Ответить с цитированием
Старый 04.06.2013, 12:41   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Просто у меня получилось сделать так, чтобы Image не мерцала.
Так ты все равно канву используешь )
Только в виде битмапа отдельного, что тоже вполне допустимо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графический редактор в С++ Kalinin93 Помощь студентам 0 04.12.2011 12:17
графический редактор BOKUBOH Помощь студентам 0 30.03.2011 21:31
Графический редактор toxich Мультимедиа в Delphi 6 15.02.2010 19:28
Графический редактор... Alex2009 Мультимедиа в Delphi 12 18.04.2009 23:55
Графический редактор kommunist Общие вопросы .NET 1 13.01.2008 21:57