Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
6 / 6 / 3
Регистрация: 19.04.2013
Сообщений: 51

Вращение TImage c PNG. Нужна переделка решения для BMP под PNG

04.06.2015, 14:45. Показов 2330. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Очень нужна помощь с вращением.
Есть решение данной проблемы для формата bmp : Повернуть Image
Если быть точным, то эта запись:https://www.cyberforum.ru/post158378.html

Работает отлично, поворачивает на любой угол. НО в примере используется Bitmap, в который png не загрузишь.
Мне нужно именно png ( т.к. прозрачность, полупрозрачность) поворачивать на любой градус.

Очень не хочется крутить все 33 файла и превращать их в 400
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2015, 14:45
Ответы с готовыми решениями:

Сохранение png в Timage
Вот ссылка на изображение http://armor.kiev.ua/wot/images/awards/Warrior.png Использовал pngimage stream:TMemoryStream; ...

Загрузка png в TImage
Пол года назад работал в Rad Studio 10 Seattle. Был у меня класс, который наследовался от TImage В конструкторе я писал: ...

Загрузка png в TImage
У меня в программе png изображения загружаются из ресурсов в OnCreate. (использую компонент pngimage)Проблема в том, что изображений много...

7
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.06.2015, 15:35
а так:
C++
1
back->Picture->Bitmap->Assign(png);
png - TPNGObject(); и работать с битмапами.
1
6 / 6 / 3
Регистрация: 19.04.2013
Сообщений: 51
04.06.2015, 18:52  [ТС]
nick42, можете привести пример кода? Сомневаюсь, что битмап вообще может принять png. Должна быть ошибка валидации
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
04.06.2015, 19:13
C++
1
back->Picture->Assign(png);
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.06.2015, 23:32
Цитата Сообщение от 3dk Посмотреть сообщение
Сомневаюсь, что битмап вообще может принять png. Должна быть ошибка валидации
И откуда сомнения эти растут, если не секрет? Под методом Assign может быть скрыто больше, чем кажется..
0
6 / 6 / 3
Регистрация: 19.04.2013
Сообщений: 51
06.06.2015, 15:43  [ТС]
Лучший ответ Сообщение было отмечено nick42 как решение

Решение

Всем спасибо. После танцев с бубном, решил задачу. Может кому будет полезно:

Мне нужно было загрузить png и крутить его, относительно центра изображения. Картинку bug.bmp я переделал в bug.png (100x100 пикселей), расположив жука строго по центру и убрав белый фон.
Финальный код получился такой:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include <Vcl.Imaging.pngimage.hpp>
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
void RotateDC(HDC__* dc,float angle);
 
Graphics::TBitmap*back;//Задний буффер
TPngImage *png;
 
float angle=0;
float RotSpeed=5;
bool IsRightDown;
bool IsLeftDown;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
DoubleBuffered = true ;
 
png = new TPngImage();
png->LoadFromFile("bug.png");
 
back=new Graphics::TBitmap();
back->Width=100;
back->Height=100;
back->Assign(png);
 
angle=0;
IsRightDown=false;
IsLeftDown=false;
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(IsRightDown==true)
     {
     angle+=RotSpeed;
     }
if(IsLeftDown==true)
     {
     angle-=RotSpeed;
     }
 
RotateDC(back->Canvas->Handle,angle);
back->Canvas->Draw(-50,-50,png);
Image1->Picture->Assign(back);
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
 
{
if(Key==VK_RIGHT)
     {
     IsRightDown=true;
     }
if(Key==VK_LEFT)
     {
     IsLeftDown=true;
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
if(Key==VK_RIGHT)
     {
     IsRightDown=false;
     }
if(Key==VK_LEFT)
     {
     IsLeftDown=false;
     }
}
//---------------------------------------------------------------------------
void RotateDC(HDC__* dc,float angle)
{
XFORM xform;
 
angle = angle * 3.1416 / 180.0;
 
xform.eDx = 50;//0.0f;
xform.eDy = 50;//0.0f;
xform.eM11 = cos(angle);
xform.eM12 = sin(angle);
xform.eM21 = -sin(angle);
xform.eM22 = cos(angle);
 
SetGraphicsMode(dc, GM_ADVANCED);
SetWorldTransform(dc, &xform);
}
//---------------------------------------------------------------------------
2
2629 / 1641 / 266
Регистрация: 19.02.2010
Сообщений: 4,357
07.06.2015, 21:48
3dk, если Билдер древний - то можно использовать GDI+, билдер пораньше научился работать с ней, чем завёл у себя класс TPngImage.

Вот сохранённый давным давно код, который надо будет переделать (не рисовать - а повернуть, а потом рисовать)
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
вот примерчик кода для BCB5 
//===================
#include <vcl.h>
//#pragma hdrstop
#include "Unit1.h"
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
 
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HDC hdc=Image1->Canvas->Handle;
  Gdiplus::Status s;
  s=Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput,NULL);
  Gdiplus::Image* image=new Gdiplus::Image(L"2.png");  
  Gdiplus::Graphics Agraphic(hdc);
  Agraphic.DrawImage(image,0,0);
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction
&Action)
{
  Gdiplus::GdiplusShutdown(gdiplusToken);
}
//===================
Думаю, что у image при необходимости её бмпшку получить можно будет без проблем.
1
0 / 0 / 0
Регистрация: 09.05.2016
Сообщений: 1
23.05.2016, 17:25
3dk, Не мог бы ты скинуть свой проект в котором png файл вращаешь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.05.2016, 17:25
Помогаю со студенческими работами здесь

Из bmp в png
Есть необходимость превращения изображения в формате bmp в изображение в формате png, так как необходимо выводить его на форму с некоторой...

Bmp to png c полупрозрачностью
Добрый день! Значит создаю bmp, в нем рисую, потом мне надо его сохранить в png с полупрозрачностью. Проблема в том, что в интернете...

Декодирование BMP и PNG
Нужно понять как декодировать BMP и PNG. Всем кто даст дельную инфу нажму &quot;+&quot;.

Пребразовать png в bmp
bmp:=tbitmap.Create; myPNG := TPNGObject.Create; img:=TMemoryStream.Create; http.Get('www.capcha.png',img); ...

Конвертация bmp в png
есть изображение созданое путём Graphics::TBitmap *Bitmap=new Graphics::TBitmap; надо переконвертировать его в пнг если не ошибаюсь...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK сделайте это, JDK, то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера . . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru