Я начал работу над своим первым приложением android и получил основу приложения, которое обрабатывает изображение с несколькими слоями. Я могу экспортировать плоскую версию файла проекта в формате PNG, но мне хотелось бы сохранить многоуровневое изображение для последующего редактирования (включая любые параметры, применяемые к определенным слоям, например, текстовые слои).
Во всяком случае, я гарантировал, что классы, которые нужно записать в файл, являются "Serializable", но столкнулись с небольшим количеством дорожного блока, вызванного тем фактом, что android.graphics.Bitmap не является сериализуемым. Следующий код по существу выводит битмап как PNG в ByteArray и должен читать его обратно как часть "readObject". Однако, когда код запускается - я могу проверить, что переменная 'imageByteArrayLength', которая считывается, такая же, как и то, что выводится, но "растровое изображение" всегда равно null.
Любая помощь будет принята с благодарностью. Спасибо за чтение.
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);
}
}