2012-07-25 18 views
9

Ich habe ein großes Bild, das zu groß ist, um in den Speicher geladen zu werden, aber ich interessiere mich nur für eine Untergruppe von Pixeln in diesem großen Bild. Ist es möglich, nur diese Teilmenge von Pixeln in den Speicher zu decodieren? Ich weiß, dass in Android eine Klasse in der API ist genau dies zu tun BitmapRegionDecoder sind so etwas wie dieseios Decode Teil eines Bildes

rief ich CGDataProviderCreateSequential gefunden, aber es braucht, um die rohen Pixel im Konstruktor ...

Gerade jetzt ich tue so etwas wie diese:

UIImage* srcImage = ...; 
    CFDataRef cgImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(srcImage.CGImage));//After this call, all pixels are decoded into memory and the app crashes 
char* imageData = (char*)CFDataGetBytePtr(cgImgDataRef); 
+0

Die aktuelle Weisheit sagt, dass die Art und Weise dies zu tun ist, Ihr Bild in Kacheln zu schneiden und nur die aktuell angezeigten Kacheln mit der entsprechenden Zoomstufe zu laden. Wie groß ist dieses Bild (in Pixeldimensionen)? – warrenm

+0

um 4096x3072 aber die Sache ist, dass ich eine Kachel des großen Bildes direkt in meine offene gl ES App laden möchte. Also muss ich die benötigten Pixel extrahieren und glTexImage2D (...) mit meinen Subpixeldaten aufrufen – AkademiksQc

+0

Ist die Größe des Unterbildes, das du entpackst, immer gleich, oder variiert es? Was ist die Reichweite? – warrenm

Antwort

10

Die einzige Möglichkeit, dies funktionieren könnte, wenn Sie eine CGImageSourceCreateWithData() (oder URL was auch immer) zu erstellen, dann erstellen CGImageRefCGImageCreateWithJPEGDataProvider oder CGImageCreateWithPNGDataProvider verwenden. Mit diesem CGImageRef könnten Sie versuchen, CGImageCreateWithImageInRect() zu verwenden und einen Teilabschnitt des großen Bildes herausziehen.

Wenn Sie versuchen, das Bild zu kacheln, erklären Sie bitte Ihre Frage, da ich dann mehr Informationen für Sie haben würde.

+0

wow es funktioniert tatsächlich! Ich habe zuvor die JPEG-Daten mit [UIImage imageNamed ...] geladen. Es scheint, dass der CGImageCreateWithJPEGDataProvider + CGImageCreateWithImageInRect() nur den benötigten Teil dekodiert. Bevor es wegen zu wenig Speicher immer abstürzte, funktioniert es jetzt. Ich werde die Dokumentation überprüfen, um zu sehen, ob es weitere Erklärungen zu diesen Methoden gibt. Für Ihre Informationen ist das Ziel, das große Bild von der Festplatte zu laden und es an opengl zu senden. Ich muss es abhängig von der maximalen OpenGL-Texturgröße, die auf dem Gerät unterstützt wird, kacheln. – AkademiksQc

+0

Für wirklich große JPEGs können Sie libjpeg-turbo verwenden und eine frei verfügbare Open Source-Bibliothek, die NEON für armv7-Beschleunigung verwendet. Ich verwende es in meinem PhotoScrollerNetwork-Projekt, um 18000x18000 NASA-Bilder auf dem Telefon zu kacheln und zu zeigen! –

+0

ok ich schaue hinein ... aber ist es nicht Software-Decodierung nur? Ich dachte, dass ich ios SDK für den eingebauten jpeg Hardwaredecoder verwenden müsste – AkademiksQc

Verwandte Themen