2009-07-15 7 views
3

Ich schreibe einige Kartensoftware für mein Smartphone und habe ein Problem, wobei ich nicht alle der (großen) Bilddateien in den Speicher laden will, wenn nur ein Teil sein wird angezeigt.Unterabschnitt von Bitmap von Festplatte in C lesen #

Gibt es eine Möglichkeit, nur einen Unterabschnitt (den sichtbaren Teil) eines großen Bildes zu lesen, vorausgesetzt, Sie kennen die x- und y-Offsets und die Breite? Ich weiß, dass es wahrscheinlich möglich ist, die Datei byteweise zu lesen, aber ich weiß nicht, wie ich das machen soll.

Danke, Nico

Antwort

2

Es wird zumindest teilweise auf welchem ​​Format (n) Ihre Bilder in gespeichert sind abhängig zu sein. Wenn Sie RAW-Bilddateien oder Bitmaps haben, kann es möglich sein, aber wenn Ihr Daten wie JPEG oder PNG komprimiert werden, wird es viel schwieriger sein, nur einen Teilabschnitt zu lesen.

1

Wenn Sie wirklich nicht alle Daten in den Speicher laden möchten, müssen Sie Ihre eigene IO-Routine schreiben, die die Datei liest. Für etwas Komplexeres als BMP könnte Ihr Dekompressionsalgorithmus kompliziert werden.

1

Können Sie das Bild nicht vorher in Abschnitte schneiden?

Teilen Sie es in viele 256x256 Pixel Bilder bedeutet, dass Sie nur ein paar von ihnen laden und sie wieder zusammenfügen auf der sichtbaren Leinwand. Um eine Implementierung zu nennen - Google Maps verwendet diese Technik.

+0

Ich würde so weit gehen zu sagen, das ist * die * richtige Lösung. Versuchen Sie, Ihre Bilddimensionen auf jeder Seite auf zwei zu belassen (vielleicht 256x256 oder 512x512). –

+0

@ 280Z28: ta für die Korrektur –

+0

Ich habe bereits die 256x256 Chunks, die das große Bild ausmachen. Ich kombinierte sie zu einem Bild, so dass ich es durch die GPS-Karten-Software bringen konnte, die es in eine GPS-Karte mit korrekter Breite/Länge umwandeln würde. Ich denke, ich könnte die lat und long verwenden, um herauszufinden, welche 256x256 Chunk geladen werden soll. Ich muss jedoch etwas über die Mathematik nachlesen, deshalb habe ich dieses Bit an die gps map-Software delegiert :) –

0

Dies ist etwas, das ich mit Bitmaps getan haben ...

public BitmapCropBitmap(BitMap fullBitmap, Rectangle rectangle) 
{ 
    return proBitmap.clone(fullBitmap, rectangle, fullBitmap.PixelFormat); 
} 
+0

erfordert das Laden der vollen Bitmap zuerst –

1

Wenn es sich um eine BMP-Datei ist, sollte es nicht so schwer sein.

Zuerst lesen Sie den Header aus der Datei, wenn ich mich richtig erinnere, es ist 44 Bytes, aber Sie können das aus der Suche im Web nach einer Spezifikation finden.

Der Header enthält Informationen wie viele Bytes pro Pixel, Gesamtbreite und -höhe, wie viele Bytes pro Scanzeile. Normalerweise wird die Bitmap auf den Kopf gestellt, so dass Sie berechnen würden, wo in der Datei das erste Pixel der unteren Zeile ist und zu dieser Stelle springen. Dann lesen Sie die gewünschten Pixel von dieser Zeile und springen zum richtigen Pixel in der nächsten Zeile.

Die Klasse FileStream hat, was Sie brauchen; eine Read Methode zum Lesen und eine Seek Methode, um zu einer bestimmten Position zu springen.

+0

Aber Sie möchten nie Ihre Ressourcen auf speichern ein Speicher beschränktes Gerät (oder vielleicht immer) in einem unkomprimierten Format. Es ist eine Verschwendung von Speicherplatz und ist viel langsamer von Festplatte/Flash geladen. –

+0

Danke für alle Antworten! Ich werde mir diesen Ansatz auch ansehen. Im Grunde habe ich ein großes Bild aus vielen 256x256 Chunks zusammengenäht. Dann hatte ich das Problem, lat/long Daten von meinem GPS Empfänger zu nehmen und zu entscheiden, welches Bildstück auf dem Bildschirm angezeigt werden soll. Um dies zu tun, habe ich die kleinen Bilder zu einem großen zusammengefügt, so dass ich es durch ein Drittanbieter-Tool laufen lassen konnte, das eine .map-Datei mit der richtigen Lat/Long-Transformation erstellt hat (nach Kalibrierung mit einer Handvoll bekannter Punkte). Ich werde weiter daran daddeln, aber ich kann nur faul und nutzen einige vorhandene Karten anstelle von ma –

+0

rannte aus dem Raum auf diesen letzten Kommentar. Danke für das Feedback, ich werde versuchen, die kleineren Brocken zu behalten. Dann wird die Herausforderung sein zu entscheiden, welche basierend auf den GPS-Koordinaten zu verwenden. Ich muss eine Art Transformation von lat/long in Pixel schreiben, die ich mir vorstelle. –