Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/48: Рейтинг темы: голосов - 48, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 15
1

Работа с изображениями в формате PNG

16.10.2011, 16:40. Показов 9913. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток...
Помогите разобраться с WinAPI, а точнее с изображениями в WinAPI.
Мне нужно сделать на С курсовой проект игру "Танчики", как на Денди была, с использованием только WinAPI. Возможно ли использовать PNG изображения или какие-нибудь другие для прорисовки деталей, чтобы можно было накладывать изображения друг на друга? Например, чтобы картинка с танком, лежащая на картинки с фоном, показывала только танк, а не танк на белом или каком-нибудь ещё фоне.
Если всё это возможно, то пожалуйста приведите пример кода с комментариями (как загрузить эти картинки, как их прорисовать и если можно как двигать по экрану эту картинку).
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2011, 16:40
Ответы с готовыми решениями:

Работа с PNG изображениями, кадрирование
Доброго времени суток дамы и господа. Возник вопрос, к которому я не знаю с какой стороны...

Работа с изображениями PNG-формата
Нужна помощь в работе с изображениями PNG-формата, в частности, как вытащить заголовок, вытащить...

Получить иконку в формате ico и сохранить ее в формате png
Здравствуйте. Мне нужно получить иконку в формате ico и сохранить ее в формате png. Использую...

Создание dll с изображениями .PNG и вывод их в Image на форме
Всем привет. Эта тема как я уже заметил не первая. Бывал тут. Вроде всё понятно да во только у...

5
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
16.10.2011, 17:13 2
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
103
104
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")
 
VOID DrawImage(HDC hdc);
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
    HWND                hWnd;
    MSG                 msg;
    WNDCLASS            wndClass;
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
 
    // Initialize GDI+.
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
    wndClass.style          = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc    = WndProc;
    wndClass.cbClsExtra     = 0;
    wndClass.cbWndExtra     = 0;
    wndClass.hInstance      = hInstance;
    wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.lpszMenuName   = NULL;
    wndClass.lpszClassName  = TEXT("GettingStarted");
 
    RegisterClass(&wndClass);
 
    hWnd = CreateWindow(
        TEXT("GettingStarted"),   // window class name
        TEXT("Getting Started"),  // window caption
        WS_OVERLAPPEDWINDOW,      // window style
        CW_USEDEFAULT,            // initial x position
        CW_USEDEFAULT,            // initial y position
        CW_USEDEFAULT,            // initial x size
        CW_USEDEFAULT,            // initial y size
        NULL,                     // parent window handle
        NULL,                     // window menu handle
        hInstance,                // program instance handle
        NULL);                    // creation parameters
 
    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    GdiplusShutdown(gdiplusToken);
    return msg.wParam;
}  // WinMain
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
    WPARAM wParam, LPARAM lParam)
{
    HDC          hdc;
    PAINTSTRUCT  ps;
 
    switch(message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        DrawImage(hdc);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
} // WndProc
 
 
VOID DrawImage(HDC hdc)
{
    Graphics graphics(hdc);
 
    // Create an Image object.
    Image image(L"Image.png");
 
    // Draw the original source image.
    graphics.DrawImage(&image, 10, 10);
 
//  // Set up the location for the image and the portion of the source to draw.
//  int x = 200;
//  int y = 30;
//  int srcx = 70;
//  int srcy = 20;
//  int srcwidth = 100;
//  int srcheight = 200;
//  Unit srcunit = UnitPixel;
// 
//  // Draw the image.
//  graphics.DrawImage(&image, x, y, srcx, srcy, srcwidth, srcheight, srcunit);
}
2
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 15
16.10.2011, 18:41  [ТС] 3
Спасибо. Хоть тут почти ничего мне не понятно но изображения поставить друг на друга смог. Можно ли двигать эти изображения или нужно менять их координаты и заново прорисовывать всё окно?

Добавлено через 47 минут
И как теперь убрать одно изображение?
0
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
16.10.2011, 19:56 4
Цитата Сообщение от Rezan0FF Посмотреть сообщение
игру "Танчики", как на Денди была, с использованием только WinAPI.
помню как-то делал сее неблагодарное дело средствами Gdi.
Цитата Сообщение от Rezan0FF Посмотреть сообщение
чтобы картинка с танком, лежащая на картинки с фоном, показывала только танк, а не танк на белом или каком-нибудь ещё фоне.
я использовал регион отсечения, что бы вывести только изображение танка.
Цитата Сообщение от Rezan0FF Посмотреть сообщение
Можно ли двигать эти изображения или нужно менять их координаты и заново прорисовывать всё окно?
естественно, меняются координаты нужных объектов и перерисовуются заново.Других способов не знаю.))
Цитата Сообщение от Rezan0FF Посмотреть сообщение
И как теперь убрать одно изображение?
а что мешает в момент перерисовки, не выводить это изображение?
0
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 15
17.10.2011, 01:33  [ТС] 5
а может ещё и gif анимации можно ставит???
0
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
30.03.2012, 11:13 6
Могу ошибаться, поправьте.

Вопрос по теме. У меня есть PNG изображение c полупрозрачными цветами. Во время выполнения программы PNG изображение можно вращять вокруг своей оси на 360 градусов при помощи методотов класса XFORM (изображение передается в функцию, которая на выходе сохраняет изображение под углом). Когда изображение только загружено и не подвергалось изменениям функцией вращения, то оно выводится как и хотелось бы, с плавными переходами и прозрачностью. Но если функция вращяет изображение, то изображение отрисовывается с белым или черным фоном. Я почитал, что в PNG может применяется несколько методов сжатия, что при работе в С++, оно автоматически переводится в TBitmap, и что вообще TPNGGraphics образован от TBitmap.
-Выходит, что вращять PNG с прозрачностью не возможно из-за сжатий?

-Есть ли иные способы работать с прозрачными картинками, вращяя их?

Цитата Сообщение от Rezan0FF Посмотреть сообщение
а может ещё и gif анимации можно ставит???
Тоже интересно можно ли автоматизировать смену кадров, возложив все на сам формат?

-Есть ли зарекомендованные или популярные способы анимации?

В поддержку темы:

Цитата Сообщение от jonson Посмотреть сообщение
я использовал регион отсечения, что бы вывести только изображение танка.
Есть успешный вариант. Сохранять изображение в BMP, рисуя объект и одноцветный фон. В программе загружать изображение в объект TBitmap и задавать параметр transparent (прозрачность в true). Делал в Билдере, там надо задавать всему окну разрешение на использование прозрачности и там же указать какой цвет должен считаться прозрачным.

Цитата Сообщение от jonson Посмотреть сообщение
естественно, меняются координаты нужных объектов и перерисовуются заново.Других способов не знаю.))
Когда совсем не умел программировать, использовал очень дурацкий вариант. Кидал в окне объект TImage, загружал картинку в него. И менял координаты TImage. Без своих кодов, картинка перемещалась по экрану и перерисовывалась.
0
30.03.2012, 11:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2012, 11:13
Помогаю со студенческими работами здесь

рисунок в формате png
на сайт вставляю рисунок формата .png. Рисунок с прозрачным фоном, но при вставке получается вместо...

построить гистограмму в формате PNG..
Вот такая заковыка,..необходимо построить гистограмму в формате PNG; из данных массив входных...

Картинка на кнопке в формате PNG
Привет, подскажите как поставить картинку на кнопку именно в формате PNG потому что в BitButton...

Сохранение рисунка в формате png
Здравствуйте уважаемые программисты! Помогите разобраться с основами директ икс. С помощью функции...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru