Qt - wczytywanie i operowanie na bitmapach za pomocą klasy QImage
Stronę tą wyświetlono już: 3546 razy
Wydawać się może to dość dziwne, że informacje na temat klasy QImage służącej do obsługi bitmap opisuję w dziale dotyczącym programowania konsolowego. Podjąłem jednak taką decyzję, gdyż w ten sposób mogę pokazać podstawy operacji możliwych do wykonania na bitmapach bez konieczności posiadania GUI.
Konfiguracja projektu
Ponieważ klasa QImage domyślnie jest przeznaczona dla projektów GUI, więc aby dostęp do pliku nagłówkowego QImage był możliwy konieczna jest edycja pliku z rozszerzeniem .pro, który jest dostępny w każdym projekcie w oknie pokazanym na poniższym rysunku.
Po dwukrotnym kliknięciu (w moim przypadku pozycji ImageExample.pro) oczom twym powinien ukazać się następujący kod:
Gdzie linijkę 2 należy zamienić na:
aby możliwe było korzystanie z klasy QImage.
Domyślnie obsługiwane formaty plików
Klasa QImage umożliwia odczyt/zapis plików następujących formatów:
Odczyt bitmapy z pliku i podstawowe jego parametry
Jak już wspomniałem klasa QImage umożliwia odczyt różnych formatów plików zawierających obraz rastrowy. Taką możliwość wczytania danych daje sam konstruktor klasy QImage:
W powyższym kodzie odczytany został plik fog.jpg oraz wyświetlona została informacja o jego rozmiarze i głębi (liczbie bitów na piksel). Niestety najwyraźniej klasa QImage zamienia 24 bitową bitmapę automatycznie przy wczytywaniu na 32 bitową (czyli z kanałem alfa).
Wynik działania powyższego kodu:
Rozmiar bitmapy: QSize(600, 400) Głębia kolorow: 32
Dostęp do pikseli bitmapy
Po wczytaniu bitmapy można pozyskać informację o kolorze danego jej piksela. Do tego celu służy metoda pixel, oto przykład jej użycia:
Wynik działania powyższego kodu:
Kolor z pozycji 100 ; 100 : "czerwony = 198; zielony = 178; niebieski = 145; alfa = 255"
Możliwe jest również ustawienie koloru danego piksela bitmapy za pomocą metody setPixel:
Wynik działania powyższego kodu:
Kolor z pozycji 100 ; 100 : "czerwony = 198; zielony = 178; niebieski = 145; alfa = 255" Kolor z pozycji 100 ; 100 : "czerwony = 0; zielony = 0; niebieski = 0; alfa = 255"
Operacje na pikselach za pomocą powyższych metod niestety są bardzo powolne, dlatego można też operować na poszczególnych pikselach bitmapy wykorzystując metodę bits, która zwraca wskaźnik do tablicy typu uchar (unsigned char) reprezentującej składowe kolorów pikseli bitmapy w układzie: czerwony, zielony, niebieski, alfa. Oto przykład wykorzystania tego wskaźnika do rozjaśnienia kolorów bitmapy:
Wynik działania powyższego kodu na przykładowej bitmapie pokazany został na poniższym rysunku.
Zapis obrazu do pliku
Obraz można również zapisać do pliku za pomocą metody save, która w przypadku niektórych formatów umożliwia również ustawienie poziomu kompresji:
Tytuł:
C++ Zbiór zadań z rozwiązaniami
Autor:
Tomasz Jaśniewski
Tytuł:
Mikrokontrolery dla hobbystów. Projekty DIY w języku C i C++
Autor:
Miguel Angel Garcia-Ruiz, Pedro Cesar Santana Mancilla
Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski
Tytuł:
Wprowadzenie do C++
Autor:
Michał Matlak
Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz
Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha
Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams
Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis
Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół
Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz