"W magazynie brak miejsca" - Bitmapy

0

Witam.

Mam problem z wczytywaniem dużych obrazków. Sporo czytałem na ten temat i problem wydaje się skomplikowany.
Być może ktoś z forum jest w stanie mi jakoś pomóc?

Problem polega na tym, iż program wyświetla podczas otwierania dużych obrazków (np: 5000x5000) błąd o treści takiej:
user image

"W magazynie brak miejsca dla wykonania tego polecenia". Wnioskuję, iż to z powodu braku miejsca w pamięci, ale tak nie jest w rzeczywistości.
Oto w jaki sposób wczytuję obrazek:

 
 TOleGraphic *Grafik = new TOleGraphic();
 TFileStream *fs = new TFileStream("D:\\folder\\a.jpg", fmOpenRead);
 Graphics::TBitmap *BMP = new Graphics::TBitmap();
 Grafik->LoadFromStream(fs);
 delete fs;

 BMP->Height =  Grafik->Height;
 BMP->Width =  Grafik->Width;
 BMP->Canvas->Draw(0, 0, Grafik);
 delete Grafik;
 Image1->Picture->Bitmap = BMP;

 delete BMP;

Albo w taki sposób:

   
   Graphics::TBitmap *BMP = new Graphics::TBitmap();
   TJPEGImage *JPG = new TJPEGImage();

   JPG->LoadFromFile("G:\\folder\\a.jpg");

   BMP->Width = JPG->Width;
   BMP->Height = JPG->Height;
   BMP->Canvas->Draw(0, 0, JPG);
   Image1->Picture->Bitmap = BMP;
   BMP->Free();
   JPG->Free();

Zauważyłem, że problem pojawia się w momencie ustalania rozmiaru bmp czyli tutaj:

 
 BMP->Height =  Grafik->Height;
 BMP->Width =  Grafik->Width;

Ale to jest wymagane, by obrazek wczytać do TImage.

Ma ktoś może jakiś pomysł w jaki sposób to obejść?

0

Przekazując tak wskaźnik do bitmapy do Image1 nie przenosisz własności, dodatkowo potem tą pamięć zwalniasz. Ze szczegółami tej biblioteki Ci nie pomogę, ale w C++ nie powinno się używać aż tyle new.

0

Trochę pomyślałem na kodem. Przeprowadziłem kilka testów i wygląda na to, że wszystko działa przynajmniej dla w miarę sensownych danych:

   TJPEGImage *JPG = new TJPEGImage;
   JPG->LoadFromFile("D:\\folder\\a.jpg");
   Image1->Picture->Bitmap->Assign(JPG);
   delete JPG;

Dla obrazka 7000x5250 wszystko ładnie działa (dość powolnie, ale działa).

1 użytkowników online, w tym zalogowanych: 0, gości: 1