Jestem całkiem nowy w C++/Qt i próbuję stworzyć aplikację z Visual Studio C++ i Qt (4.8.3). Aplikacja wyświetla obrazy przy użyciu QGraphicsView, potrzebuję zmienić obrazy na poziomie pikseli.Problemy z dużym QImage
Kod zasadowy (uproszczony):
QImage* img = new QImage(img_width,img_height,QImage::Format_RGB32);
while(do_some_stuff) {
img->setPixel(x,y,color);
}
QGraphicsPixmapItem* pm = new QGraphicsPixmapItem(QPixmap::fromImage(*img));
QGraphicsScene* sc = new QGraphicsScene;
sc->setSceneRect(0,0,img->width(),img->height());
sc->addItem(pm);
ui.graphicsView->setScene(sc);
Działa to dobrze dla zdjęć do około 12000x6000 piksela. Dziwna rzecz dzieje się poza tym rozmiarem. Po ustawieniu na przykład img_width=16000
i img_height=8000
, linia img = new QImage(...)
zwraca pusty obraz. Dane obrazu powinny wynosić około 512 000 000 bajtów, więc nie powinny być zbyt duże, nawet w systemie 32-bitowym. Ponadto mój komputer (Win 7 64bit, 8 GB RAM) powinien być zdolny do przechowywania danych.
Ja również próbowałem tej wersji:
uchar* imgbuf = (uchar*) malloc(img_width*img_height*4);
QImage* img = new QImage(imgbuf,img_width,img_height,QImage::Format_RGB32);
na początku, to działa. Wskaźnik img jest prawidłowy i wywołanie na przykład img->width()
zwraca poprawną szerokość obrazu (zamiast 0, na wypadek, gdyby wskaźnik obrazu był pusty). Ale gdy zadzwonię pod numer img->setPixel()
, wskaźnik stanie się pusty i img->width()
zwróci 0.
Co więc robię źle? Czy istnieje lepszy sposób modyfikowania dużych obrazów na poziomie pikseli?
Pozdrowienia, David
Spróbuj ręcznie wyzerować pamięć malloc'd, aby sprawdzić, czy alokacja rzeczywiście działa. –
Spójrz na to: [Qt Project Wiki: ładowanie dużych obrazów] (http://qt-project.org/wiki/LoadingLargeImages) – dschulz
Pamiętaj, że w 32-bitowej aplikacji Windows domyślna największa alokacja może być wynikiem Fragmentacja przestrzeni adresowej będzie wynosić około 1,2 GB (przestrzeni adresowej aplikacji o pojemności 2 GB) bez użycia flagi/LARGEADDRESSAWARE i/lub do zmiany bibliotek dll używanych przez aplikację w celu zmniejszenia fragmentacji. – drescherjm