C++/Qt için oldukça yeni ve Visual Studio C++ ve Qt (4.8.3) ile bir uygulama oluşturmaya çalışıyorum. Uygulama bir QGraphicsView kullanarak görüntüleri görüntüler, ben görüntüleri piksel düzeyinde değiştirmem gerekiyor.Büyük QImage ile ilgili sorunlar
temel kodu (basitleştirilmiş) olduğu:
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);
Bu çevrede 12000x6000 piksele kadar görüntüler için iyi çalışır. Garip olan bu büyüklüğün ötesinde olur. Ben mesela img_width=16000
ve img_height=8000
, boş bir görüntü verir img = new QImage(...)
hattını ayarladığınızda. Görüntü verileri 512.000.000 bayt civarında olmalıdır, bu nedenle 32 bitlik bir sistemde bile çok büyük olmamalıdır. Ayrıca, makinem (Win 7 64bit, 8 GB RAM) verileri tutabilmelidir.
Ben de bu sürüm denedim: İlk başta
uchar* imgbuf = (uchar*) malloc(img_width*img_height*4);
QImage* img = new QImage(imgbuf,img_width,img_height,QImage::Format_RGB32);
, bu çalışır. Img işaretçisi geçerli ve img->width()
numaralı telefonu çağırmak, örneğin doğru görüntü genişliğini (görüntü işaretçisinin boş olması durumunda 0 yerine) döndürür. Ama en kısa sürede img->setPixel()
dediğimiz gibi, işaretçi boş olur ve img->width()
döner yanlış yapıyorum Yani
0.? Yoksa büyük görüntülerin piksel düzeyinde değiştirilmesinin daha iyi bir yolu var mı?
Selamlar, David
elle ayırma aslında çalışıp çalışmadığını görmek için ilk malloc'd hafızayı sıfır çalışın. –
Şunlara bir göz atın: [Qt Project Wiki: Büyük Resim Yükleme] (http://qt-project.org/wiki/LoadingLargeImages) – dschulz
Bir 32 bit pencere uygulamasında, sonuçta yapabileceğiniz varsayılan en büyük ayırmayı unutmayın. adres alanı parçalanma/LARGEADDRESSAWARE bağlayıcı işareti kullanılarak ve/veya uygulama parçalanması azaltmak için kullandığı DLL rebasing olmadan (2GB uygulama adres alanının) 1.2GB etrafında olacaktır. – drescherjm