Что делает моя заявка:LibGDX: Как получить изображение, которое было снято камерой и сохранено локально?
1 Пользователь может сделать снимок через камеру устройства. (работы)
2- Приложение создает новый файл со следующими папками (протестировано со следующими папками, чтобы убедиться, что она сохраняет файл правильно):
a. File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "images");
- File mediaFile = new File(mediaStorageDir.getPath()+File.separator+fileName + ".jpg");
b. File mediaStorageDir = new File(Gdx.files.getExternalStoragePath().toString());
- File mediaFile = new File(mediaStorageDir.getPath()+File.separator+fileName+".jpg");
c. File mediaStorageDir = new File(Gdx.files.getLocalStoragePath().toString());
- File mediaFile = new File(mediaStorageDir.getPath()+File.separator+fileName+".jpg");
3 - Приложение пересказывает + сжимает изображение до 1024x512 с bmp.compress (качество = 25), а затем сохраняет его. (работ)
public boolean compressToFile(byte[] data, int quality, File fileHandle) {
File mediaFile = fileHandle;
Pixmap pixmap = new Pixmap(data, 0, data.length);
if(quality<0)
quality = 0;
if(quality>100)
quality = 100;
FileOutputStream fos;
int x=0,y=0;
int xl=0,yl=0;
try {
Bitmap bmp = Bitmap.createBitmap(pixmap.getWidth(), pixmap.getHeight(), Bitmap.Config.ARGB_8888);
// we need to switch between LibGDX RGBA format to Android ARGB format
for (x=0,xl=pixmap.getWidth(); x<xl;x++) {
for (y=0,yl=pixmap.getHeight(); y<yl;y++) {
int color = pixmap.getPixel(x, y);
// RGBA => ARGB
int RGB = color >> 8;
int A = (color & 0x000000ff) << 24;
int ARGB = A | RGB;
bmp.setPixel(x, y, ARGB);
}
}
fos = new FileOutputStream(mediaFile, false);
boolean compressed = bmp.compress(CompressFormat.JPEG, quality, fos);
if(compressed)
System.out.println("zgzg2020:: compressed SUCCESS!");
else
System.out.println("zgzg2020:: compressed FAILED!");
fos.close();
int WIDTH = 1024, HEIGHT = 512;
File f = mediaFile;
Bitmap shrunkBmp = downsizeImage(f, WIDTH, HEIGHT);
fos = new FileOutputStream(mediaFile, false);
shrunkBmp.compress(CompressFormat.JPEG, 100, fos);
fos.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return false;
}
Масштаб вниз.
public Bitmap downsizeImage(File file, int width, int height) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2; // for 1/2 the image to be loaded
Bitmap thumb = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(file.getPath(), opts), width, height, false);
return thumb;
}
4 Чтобы подтвердить правильность сохранения jpg. Я тестировал все три пути.
System.out.println("b4 pictureFile= " + file.getPath().toString() + "=> " + file.exists());//Returns false.
compressToFile(data, quality, file);//Here is where the compression, scale down, write to disk.
System.out.println("af pictureFile= " + file.getPath().toString() + "=> " + file.exists());//Returns true
5- Читайте эту сохраненную фотографию и визуализируйте ее на экране. Приложение аварийно завершает работу здесь !!!
mode = Mode.render;
System.out.println("AssessPath:"+file.toString());//to confirm the path
texture = new Texture(file.toString());//(FAILS!!)
ОШИБКА
com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file
Примечания:
Я проверил мое приложение на двух машинах, Зефир, леденец. Не работает с одинаковой ошибкой.
Разрешения кажутся собственно:
После сохранения файлов на компьютере, я вручную скопировать файлы в папку активов. Приложение смогло открыть файл; поэтому я уверен, что файл соответствует требованиям LibGDX ... и т. д.
Я искал через так много статей и вопрос/ответов, не может найти причину моей проблемы:
https://github.com/libgdx/libgdx/wiki/File-handling#writing-to-a-file
https://github.com/libgdx/libgdx/wiki/Integrating-libgdx-and-the-device-camera
com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: - Error
Спасибо за быстрый ответ! Я проверю его сразу и дам вам знать, как это происходит! – coffeenet
Я добавил это в свой код. Однако galleryOpener.openGallery() открывает галерею на моем устройстве, но поток приложения продолжается прямо до следующего кода, не дожидаясь, когда я выберу фотографию; таким образом, сбой «batch.beging() texture = null». Как я могу заставить метод openGallery дождаться, когда я выберу фотографию, прежде чем возвращать элемент управления обратно в String selectedImagePath = galleryOpener.getSelectedImagePath(); линия? – coffeenet
Я все еще застрял ... Элемент управления просто не дожидался, когда пользователь выберет изображение в галерееОпеннер, прежде чем он вернется в цикл рендеринга. Он просто продолжает сбой с нулевым указателем. Я боюсь, что этот ответ не работает. – coffeenet