Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
Ali007
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 22
1

Отрисовка изображения поверх канвы (изображения) и вращение изображения

18.07.2012, 10:13. Просмотров 3926. Ответов 16
Метки нет (Все метки)

Здравствуйте.
Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder.
Хочу сделать одну интересную штуку, но пока не выходит.
Надо загрузить на форму изображение (типа карту) и сделать, чтобы поверх карты летал самолётик.
Первая часть трудностей не вызвала, разместил на форме Image и OpenDialog и дело в шляпе.
А вот с самолётом начались трудности.
1) Самолёт загружаю из файла .bmp ; в .bmp сохранял из .png с прозрачным фоном.
На экран (в виде Image2) всё равно выводится с белым фоном, который совершенно мне не нужен.
2) Хочу чтобы самолёт поворачивался, в процессе полёта. Для этого использовал метод вращения с использованием DIBs. Самый последний, описанный здесь. Оттуда кстати и загружаю его из файла и на последнем шаге копирую в Image.
Всё хорошо вращается, но в добавок к белому фону, добавляется ещё черный, от вращения.
Что можно с этим сделать?

Знаю немного OpenGL. Если проще им, то подскажите что и как делать.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2012, 10:13
Ответы с готовыми решениями:

Вращение изображения
Как можно вращать вокруг своей оси bmp изображение?

Вращение изображения
Вращение изображений. Пробовал сматреть там где 2D игру делали, короче как я...

Вращение изображения?
У меня на форме Image1 я в него загружаю изображение и как мне с помощью...

Загрузка изображения в Image с сохранении соотношения сторон изображения
загрузка изображения в Image(с фиксированным размером) при этом изображение...

Изменение яркости контрастности изображения. Бинаризация изображения
Товарищи программисты помогите с разработкой алкоритма для изменеие яркости...

16
Ali007
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 22
19.07.2012, 10:48  [ТС] 2
Наверняка не такая уж и сложная задачка. Не уже ли никто не может помочь?
Если что-то не понятно, не стесняемся спрашиваем ))
0
Mr.Sandman
40 / 57 / 15
Регистрация: 19.12.2011
Сообщений: 552
19.07.2012, 11:43 3
Цитата Сообщение от Ali007 Посмотреть сообщение
Самолёт загружаю из файла .bmp ; в .bmp сохранял из .png с прозрачным фоном.
На экран (в виде Image2) всё равно выводится с белым фоном, который совершенно мне не нужен.
(домой приду поподробнее напишу)
В image самолетика ставишь Transparent Color = clWhite; и TransparentColor = true;
1
Ali007
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 22
23.07.2012, 10:52  [ТС] 4
Цитата Сообщение от Mr.Sandman Посмотреть сообщение
(домой приду поподробнее напишу)
В image самолетика ставишь Transparent Color = clWhite; и TransparentColor = true;
Какую-то ерунду вы сейчас написали. Таких свойств нет. Установил Transparent = true; Теперь черный фон пропадает через раз (Смотрите вложения). Т.е. 4 кадра с черным фоном, 1 без него и так далее...
0
Миниатюры
Отрисовка изображения поверх канвы (изображения) и вращение изображения   Отрисовка изображения поверх канвы (изображения) и вращение изображения  
BRcr
4020 / 2310 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
23.07.2012, 11:20 5
Не используй TImage - для анимации не лучший вариант, много лишних скрытых действий.
Лучше каждый кадр рисовать на временном TBitmap, а уж его после этого рисовать на канву, скажем, формы. Порядок отрисовки кадра такой: сперва фон(карта), потом делаем SetWorldTransform() для канвы временного TBitmap, выставляя нужный поворот, и рисуем самолет в нужном месте.
0
Ali007
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 22
23.07.2012, 12:40  [ТС] 6
Цитата Сообщение от BRcr Посмотреть сообщение
Не используй TImage - для анимации не лучший вариант, много лишних скрытых действий.
Лучше каждый кадр рисовать на временном TBitmap, а уж его после этого рисовать на канву, скажем, формы. Порядок отрисовки кадра такой: сперва фон(карта), потом делаем SetWorldTransform() для канвы временного TBitmap, выставляя нужный поворот, и рисуем самолет в нужном месте.
Ваш метод конечно хорош, но только полачется, что для отрисовки мне надо будет каждый раз заново подгружать карту, что не есть хорошо. Или вы имеете вв виду, что-то другое. Можно реальный пример использования?

------------------------------------------------------------------------------------

После некоторого колдовства с транспарентом
DestBitmap->TransparentColor = clBlack; //*
DestBitmap->Transparent = true; //*
Стало так, как на картинке. Но как дальше продвинуться не имею понятия
0
Изображения
 
BRcr
4020 / 2310 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
24.07.2012, 21:32 7
Цитата Сообщение от Ali007 Посмотреть сообщение
полачется, что для отрисовки мне надо будет каждый раз заново подгружать карту, что не есть хорошо.
Чего ради ее подгружать более одного раза? Просто не надо ее удалять из памяти.

Вот, пример набросал - моя любимая сушка стережет родину, так сказать.
Экзешник - Win32.rar.
Код:
C++
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
#ifndef Unit1H
#define Unit1H
// ---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <memory>
// ---------------------------------------------------------------------------
class TForm1
               : public TForm {
__published: // IDE-managed Components
private:     // User declarations
public:      // User declarations
 
    std::auto_ptr<TTimer> engine_tmr;
    std::auto_ptr <Graphics::TBitmap> map_bmp, plane_bmp, result_bmp;
 
    void __fastcall engine_ontimer( TObject *_sender );
    void __fastcall RotateDC(HANDLE dc,float angle);
    __fastcall TForm1( TComponent *Owner );
};
// ---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
// ---------------------------------------------------------------------------
#endif
C++
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
#include <vcl.h>
#include <math.h>
#pragma hdrstop
 
#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1( TComponent *Owner )
               : TForm( Owner ) {
    engine_tmr = std::auto_ptr <TTimer> ( new TTimer( this ) );
    map_bmp = std::auto_ptr <Graphics::TBitmap> ( new Graphics::TBitmap( ) );
    plane_bmp = std::auto_ptr <Graphics::TBitmap> ( new Graphics::TBitmap( ) );
    result_bmp = std::auto_ptr <Graphics::TBitmap> ( new Graphics::TBitmap( ) );
 
    engine_tmr->Interval = 40;
    engine_tmr->OnTimer = & engine_ontimer;
    map_bmp->LoadFromFile( "map.bmp" );
    result_bmp->SetSize( map_bmp->Width, map_bmp->Height );
    plane_bmp->LoadFromFile( "su-27.bmp" );
    plane_bmp->Transparent = true;
    plane_bmp->TransparentColor = clWhite;
    ClientWidth = map_bmp->Width;
    ClientHeight = map_bmp->Height;
    DoubleBuffered = true;
 
    engine_tmr->Enabled = true;
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::engine_ontimer( TObject *_sender ) {
    result_bmp->Canvas->Draw( 0, 0, map_bmp.get( ) );
 
    static float angle = 0, angle_delta = 2;
    static int y, x, r = map_bmp->Height / 2 - map_bmp->Height / 6;
 
    x = r * cos( ( angle - 90 ) * 3.1416 / 180.0 ) + map_bmp->Width / 2;
    y = r * sin( ( angle - 90 ) * 3.1416 / 180.0 ) + map_bmp->Height / 2;
 
    result_bmp->Canvas->TextOut( 0, 0, "angle: " + FloatToStr( angle ) +
        " x: " + FloatToStr( x ) + " y: " + FloatToStr( y ) );
 
    RotateDC( result_bmp->Canvas->Handle, angle );
    SetViewportOrgEx( result_bmp->Canvas->Handle, x, y, NULL );
    result_bmp->Canvas->Draw( -plane_bmp->Width / 2, -plane_bmp->Height / 2, plane_bmp.get( ) );
    RotateDC( result_bmp->Canvas->Handle, 0 );
    SetViewportOrgEx( result_bmp->Canvas->Handle, 0, 0, NULL );
    angle >= 360 ? angle = angle_delta : angle += angle_delta;
 
    Canvas->Draw( 0, 0, result_bmp.get( ) );
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::RotateDC( HANDLE dc, float angle ) {
    XFORM xform;
 
    angle = angle * 3.1416 / 180.0;
    xform.eDx = 0.0f;
    xform.eDy = 0.0f;
    xform.eM11 = cos( angle );
    xform.eM12 = sin( angle );
    xform.eM21 = -sin( angle );
    xform.eM22 = cos( angle );
 
    SetGraphicsMode( ( HDC__ * )dc, GM_ADVANCED );
    SetWorldTransform( ( HDC__ * )dc, &xform );
}

Не по теме:

RotateDC - не моя функция, здесь выкладывал кто-то... просто она весьма удобна:)

1
серофим
2 / 2 / 0
Регистрация: 09.11.2011
Сообщений: 85
13.04.2013, 20:46 8
Доброго времени суток. Почему при запуске виден только фон?
Поворачиваем изображение в z и рисуем , а его вообще не видно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 XFORM f;
     SetGraphicsMode(z, GM_ADVANCED);
 
      f.eM11 = (FLOAT) 0.8660;
      f.eM12 = (FLOAT) 0.5000;
      f.eM21 = (FLOAT) -0.5000;
      f.eM22 = (FLOAT) 0.8660;
      f.eDx  = (FLOAT) 0.0;
      f.eDy  = (FLOAT) 0.0;
      SetWorldTransform(z, &f);  
 
  BitBlt(context, 0, 0,700,500, fon, 0, 0, SRCCOPY);
  BitBlt(context, mks->x,mks->y,40,30, z, 0, 0, SRCCOPY);
0
BRcr
4020 / 2310 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
14.04.2013, 20:29 9
Посмотри на приведенный код, SetWorldTransform() применяется к канве, на которой рисуем фон и все прочее, а не к канве, на которой одно из исходных изображений, как сделано у тебя.
1
серофим
2 / 2 / 0
Регистрация: 09.11.2011
Сообщений: 85
14.04.2013, 20:36 10
BRcr,т.е. происходит как бы поворот системы координат этой канвы? Не подскажете тогда , как всё-таки осуществить поворот ?
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
14.04.2013, 20:55 11
Цитата Сообщение от Mr.Sandman Посмотреть сообщение
В image самолетика ставишь Transparent Color = clWhite; и TransparentColor = true;
Ну собственно кажется эти свойства есть в TBitmap.
А вообще за прозрачность отвечает правый нижний пиксель.
0
LK
Заблокирован
14.04.2013, 22:11 12
левый
0
Avazart
Эксперт С++
7756 / 5662 / 554
Регистрация: 10.12.2010
Сообщений: 25,663
Записей в блоге: 17
14.04.2013, 22:28 13
точно ..
0
BRcr
4020 / 2310 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
15.04.2013, 12:35 14
Цитата Сообщение от серофим Посмотреть сообщение
Не подскажете тогда , как всё-таки осуществить поворот ?
Пример же есть, просто повтори. Вот отдельно интересующий тебя кусок, раз так не видно:
C++
1
2
3
4
5
    RotateDC( result_bmp->Canvas->Handle, angle );
    SetViewportOrgEx( result_bmp->Canvas->Handle, x, y, NULL );
    result_bmp->Canvas->Draw( -plane_bmp->Width / 2, -plane_bmp->Height / 2, plane_bmp.get( ) );
    RotateDC( result_bmp->Canvas->Handle, 0 );
    SetViewportOrgEx( result_bmp->Canvas->Handle, 0, 0, NULL );
1
серофим
2 / 2 / 0
Регистрация: 09.11.2011
Сообщений: 85
17.04.2013, 15:19 15
Цитата Сообщение от BRcr Посмотреть сообщение
Пример же есть, просто повтори.
По отдельности все функции то понятны ,но вот применённые вместе...
0
Gendalf147
3 / 5 / 0
Регистрация: 09.12.2012
Сообщений: 97
27.10.2014, 15:24 16
А если Image1 (та, что снизу лежит) нельзя трогать - даже запомнить нельзя ... Как тогда на Image2 (сверху Image1) вывести линию черную, чтобы было под Image2 видно Image1?
0
BRcr
4020 / 2310 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
27.10.2014, 19:47 17
Как минимум, подлежащее изображение должно обновляться при обновлении надлежащего. А это уже подразумевает доступ к нижнему изображению.

Gendalf147, зачем такие тернии? Обрисуй задачу, может, найдется решение посмекалистей....
0
27.10.2014, 19:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2014, 19:47

Вращение изображения, как сделать?
Как сделать так, чтобы изображение вращалось вокруг одной точки, т.е. чтобы...

Поворот (вращение) изображения формата bmp
Решил реализовать данную задачу, используя лишь математику (теорию взял из...

Рисунок поверх загруженного изображения
Ребята! Проблема такая есть два Image в первый загружается изображение, теперь...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru