Как отобразить PNG изображение в приложении на C++ с использованием WinAPI?

Каким образом можно использовать WinAPI для вывода изображения в формате PNG на окно?
  • 26 апреля 2024 г. 8:10
Ответы на вопрос 2
Для отображения PNG изображения в приложении на C++ с использованием WinAPI необходимо загрузить библиотеку для работы с PNG форматом, например, библиотеку libpng. Затем можно использовать следующий код для загрузки и отображения PNG изображения:

1. Загрузка изображения в память:

```cpp
#include <iostream>
#include <fstream>
#include <vector>

std::vector<unsigned char> LoadPNG(const char* filename, int& width, int& height) {
    std::ifstream file(filename, std::ios::binary);
    if (!file.is_open()) {
        std::cerr << "Error opening file: " << filename << std::endl;
        return std::vector<unsigned char>();
    }

    std::vector<unsigned char> image;
    file.seekg(8);

    unsigned char byte;
    while (file.read(reinterpret_cast<char*>(&byte), 1)) {
        image.push_back(byte);
    }

    file.close();

    return image;
}
```

2. Отображение изображения на окне с помощью WinAPI:

```cpp
#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_PAINT: {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // загрузка картинки
        int width, height;
        std::vector<unsigned char> image = LoadPNG("image.png", width, height);

        // отображение картинки
        int scanline = width * 4;
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int index = (y * scanline) + (x * 4);
                COLORREF color = RGB(image[index], image[index + 1], image[index + 2]);
                SetPixel(hdc, x, y, color);
            }
        }

        EndPaint(hwnd, &ps);
        return 0;
    }
    case WM_CLOSE: {
        DestroyWindow(hwnd);
        return 0;
    }
    case WM_DESTROY: {
        PostQuitMessage(0);
        return 0;
    }
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // создание окна
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"WinAPI PNG Image";
    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(0, wc.lpszClassName, L"PNG Image", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
```

Этот код открывает окно с изображением в формате PNG и использует функцию `LoadPNG` для загрузки изображения из файла. Далее, в функции отображения окна `WindowProc` происходит отображение изображения пиксель за пикселем на окне с помощью функции `SetPixel`.

Не забудьте добавить в проект библиотеку libpng и скомпилировать программу с соответствующими настройками компилятора.
Похожие вопросы