Ich habe mit der Arbeit an meiner ersten Android-Anwendung begonnen und habe die Grundlage für eine Anwendung, die ein Bild mit mehreren Ebenen bearbeitet. Ich bin in der Lage, eine flache Version der Projektdatei als PNG zu exportieren, aber ich möchte in der Lage sein, das geschichtete Bild für die spätere Bearbeitung zu speichern (einschließlich aller Optionen, die auf bestimmte Ebenen angewendet werden, wie z. B. textbasierte Ebenen).
Jedenfalls habe ich dafür gesorgt, dass die Klassen, die in eine Datei geschrieben werden müssen, "serialisierbar" sind, bin aber auf ein kleines Hindernis gestoßen, das durch die Tatsache verursacht wird, dass Android.graphics.Bitmap nicht serialisierbar ist. Der folgende Code gibt im Wesentlichen die Bitmap als PNG in ein ByteArray aus und sollte es als Teil von 'readObject' wieder einlesen. Wenn der Code jedoch ausgeführt wird, kann ich überprüfen, dass die eingelesene Variable "imageByteArrayLength" mit der ausgegebenen Variable übereinstimmt, aber das "Bitmap-Bild" ist immer null.
Für jede Hilfe wären wir Ihnen sehr dankbar. Danke fürs Lesen.
private String title;
private int width;
private int height;
private Bitmap sourceImage;
private Canvas sourceCanvas;
private Bitmap currentImage;
private Canvas currentCanvas;
private Paint currentPaint;
private void writeObject(ObjectOutputStream out) throws IOException{
out.writeObject(title);
out.writeInt(width);
out.writeInt(height);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
currentImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] imageByteArray = stream.toByteArray();
int length = imageByteArray.length;
out.writeInt(length);
out.write(imageByteArray);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
this.title = (String)in.readObject();
this.width = in.readInt();
this.height = in.readInt();
int imageByteArrayLength = in.readInt();
byte[] imageByteArray = new byte[imageByteArrayLength];
in.read(imageByteArray, 0, imageByteArrayLength);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap image = BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArrayLength, opt);
sourceImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
currentImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
sourceCanvas = new Canvas(sourceImage);
currentCanvas = new Canvas(currentImage);
currentPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
if ( image != null ) {
sourceCanvas.drawBitmap(image, 0, 0, currentPaint);
}
}