Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 46

Рисование на bmp

28.09.2014, 21:57. Показов 3086. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть объект типа TGraphicControl, который нужно будет вывести на экран.
У него перегружаю метод Paint.
Внутри неё рисую(с учетом всех свойств объекта ведутся расчеты) на bmp который объявлен внутри paint,
затем тут же вывожу на экран Canvas.Draw(0,0,BMP).
Когда меняется значение любого из свойств вызываю invalidate.
В итоге когда двигаю за scrollbar картинка хорошенько мерцает.
Как я понял когда двигаю этот самый scrollbar вызывается Paint И каждый раз он все это дело пересчитывает.
Хотя достаточно было бы просто выводить нарисованный BMP на экран.
Вопрос: Как это реализовать?

PS/Извиняюсь что только на словах без примера. Код слишком большой, никто не захочет в него вникать, а выбросить
из него нечего.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2014, 21:57
Ответы с готовыми решениями:

Конвертер BMP 32 bit BGRA в BMP 8 bit c Palette
Добрый день! есть следующий вариант преобразования procedure TForm1.Button1Click(Sender: TObject); begin ...

Рисование BMP файла на QImage
Вообщем рисую bmp файл на QImage: QImage tmp(width, height, QImage::Format_RGB666); for (int j=0; j<height;++j) ...

Рисование BMP-картинки по пикселям
Добрый день! получил задание нарисовать BMP-картинку, используя стандартную структуру BMP-файла и команду SetPixel. Программу написал,...

32
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
29.09.2014, 16:45
Лучший ответ Сообщение было отмечено Radiance72 как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Radiance72 Посмотреть сообщение
где делать вкл выкл этих флагов
Сброс флага - после расчетов и отрисовки графконтрола в его буферный битмап.
Взведение флага - при изменении любого из параметров расчетов, например, изменение размеров графконтрола или изменение каких-то объектов, рендеринг растровых образов которых происходит при построении результирующей сцены на канве графконтрола.

Факт же начала или окончания скроллинга к изменениям параметров расчетов отношения не имеет, ибо отрисовка выполняется не на канву скроллбокса.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.09.2014, 16:45
Цитата Сообщение от Radiance72 Посмотреть сообщение
Нужны
Зачем?
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 46
29.09.2014, 16:57  [ТС]
Использовать Timage не вариант, много заморочек, поздняк метаться как говорится.
Одна проблема:
Цитата Сообщение от Radiance72 Посмотреть сообщение
Вопрос лишь в том где делать вкл выкл этих флагов.
Добавлено через 1 минуту
Точнее в какие события их воткнуть?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.09.2014, 17:02
Это с имейджем то заморочки? Он же прост до безобразия.
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 46
29.09.2014, 17:17  [ТС]
Не это с TGraphicControl проблема,для Timage перерисовывать много

Добавлено через 2 минуты
переписывать, уже заговариваюсь)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
29.09.2014, 17:18
Имидж принципиально отличается от графконтрола только наличием встроенного того самого буферного битмапа.
Если рассматривать имидж vs графконтрол только в этой плоскости, то применение имиджа в целом и общем может быть оправдано.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.09.2014, 17:21
Так, всё ясно. Заморочек полно сейчас. На столько, что
Цитата Сообщение от Radiance72 Посмотреть сообщение
уже заговариваюсь)
. Забудь графоконтрол, как страшный сон, воткни TImage и быстро сделай. Если есть другие TGraphicControl и они уже сделаны, то их не трогай.
1
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 46
29.09.2014, 17:28  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Сброс флага - после расчетов и отрисовки графконтрола в его буферный битмап.
Взведение флага - при изменении любого из параметров расчетов, например, изменение размеров графконтрола или изменение каких-то объектов, рендеринг растровых образов которых происходит при построении результирующей сцены на канве графконтрола.
Попробую Так!
Возможно прокатит.
Цитата Сообщение от taras atavin Посмотреть сообщение
Забудь графоконтрол, как страшный сон
Не могу(
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
29.09.2014, 17:52
Цитата Сообщение от taras atavin Посмотреть сообщение
воткни TImage и быстро сделай
Какая собссно разница, на каком битмапе ТС имеет проблему (или она его) - на подключенном к TImage.Picture или на собственноручно контролируемом ?)

Битмап он и в Африке остается битмапом, разница лишь в том, что при получении PAINT-сообщения графконтрол-имдж будет пытаться самостоятельно (т.е. без явного ручного вмешательства) отрисовать на своей канве то что лежит во встроенном битмапе, в то время как при использовании своего наследника графконтрола нужно ручками перекрывать виртуальный Paint и ручками же что-то там рисовать на канве, например, копировать туда канву своего буферного битмапа.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.09.2014, 20:38
Цитата Сообщение от mss Посмотреть сообщение
разница лишь в том, что при получении PAINT-сообщения графконтрол-имдж будет пытаться самостоятельно (т.е. без явного ручного вмешательства) отрисовать на своей канве то что лежит во встроенном битмапе,
Вот именно. И все проблемы с трёхтысячекратной перерисовкой прямо на экране там уже решены.

Добавлено через 21 минуту
Имэйдж не надо перерисовывать при каждом инвалидейте, достаточно или один раз нарисовать, или перерисовывать только при изменении самого изображения, а соответственно не надо мучиться с событиями и мудрить движение битмапа, он уже качественно икапсулирует перерисовку. Если же всё таки возникнет необходимость стирать имейдж, то чтоб не мигал достаточно рисовать во внеэкранном битмапе по размерам имейджа, а потом готовый битмап класть на имейдж. При многократном выводе одного и того же и при выводе готового буферного битмапа со сдвинутым изображением на кэнвэс он не мигает. Я на нём делал через буферный битмап симулятор самописца, как бы ни дёргались кривые, мигания не было ни при обновлении с частотой таймера, ни даже при перерисовке из несинхронизированного вторичного потока.

Добавлено через 1 час 30 минут
И уж подавно не было миганий при ручном скролировании.
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 46
01.10.2014, 21:20  [ТС]
Попробовал через флаги, стало куда лучше, но картинка всеравно немного мерцает, причем чем больше таких объектов тем сильнее.
Решил попробовать через TImage, однако тупик. Вот код, который не хочет ничего рисовать.
В чем проблема?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
 
type
  TForm2 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TMyObject = class
    Image: TImage;
    BMP: TBitmap;
    constructor create(Conteiner: TWinControl);
    destructor destroy;
 
    procedure ObjPaint;
  end;
 
var
  Form2: TForm2;
  Obj: TMyObject;
 
implementation
 
{$R *.dfm}
{ TMyObject }
 
constructor TMyObject.create(Conteiner: TWinControl);
begin
  Image := TImage.create(Conteiner);
  Image.Parent := Conteiner;
  Image.Width := 500;
  Image.Align := alLeft;
 
  BMP := TBitmap.create;
 
  Image.Picture.Bitmap := BMP;
 
end;
 
destructor TMyObject.destroy;
begin
  Image.Free;
end;
 
procedure TMyObject.ObjPaint;
begin
  with BMP.Canvas do
  begin
    Pen.Color := clBlack;
    MoveTo(5, 5);
    LineTo(200, 200);
  end;
 
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  Obj := TMyObject.create(Panel1);
  Obj.ObjPaint;
end;
 
end.
Добавлено через 1 час 28 минут
Прошу прощения, все, Разобрался)

Добавлено через 15 секунд
Прошу прощения, все, Разобрался)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.10.2014, 14:23
Цитата Сообщение от Radiance72 Посмотреть сообщение
Попробовал через флаги, стало куда лучше, но картинка всеравно немного мерцает, причем чем больше таких объектов тем сильнее.
Решил попробовать через TImage, однако тупик. Вот код, который не хочет ничего рисовать.
В чем проблема?
А кто Вам сказал на TImage рисовать по событию PAINT? PAINT - это событие перерисовки, а Вам надо нарисовать. Один раз на каждое изменение самой картинки (считая за таковое и любое перемещение её относительно TImage). В крайнем случае вешайте на OnShow, если не можете разобраться, чем рисование от перерисоки отличается.
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 46
02.10.2014, 14:26  [ТС]
Посмотри пожалуйста Мелькание картинки при скролле
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.10.2014, 14:26

Рисование BMP изображения 16 bit/pixel
Ребят, помогите разобраться мне в одном вопросе. Я тут разобрался и написал код для рендеринга, если это так можно назвать, .bmp...

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс "8 битное BMP изображение".Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Создание монохромного bmp из одной из 24-х плоскостей 24-битного bmp
Здравствуйте. Стоит задача разбить 24-х битное bmp изображение на 24 плоскости с последующей возможностью генерации 24 монохромных...

Изображение bmp, операция над ним, снова в bmp
Задание состоит в следующем: 1. Перевести изображение в матрицу. 2. Удалить определенные объекты(в матрице). 3. Вывести...

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3 4 1 3 кпримеру, мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
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. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru