2016-01-22 3 views
0

Что делает моя заявка: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 

Примечания:

ответ

1

Я делаю это с platform specific code. Этот интерфейс используется в основном коде.

public interface GalleryOpener { 
    void openGallery();  
    String getSelectedImagePath(); 
} 

И это реализация на android.

public class AndroidLauncher extends AndroidApplication implements GalleryOpener { 

    public static final int SELECT_IMAGE_CODE = 1; 
    private String selectedImagePath; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 

     initialize(new GreenWall(this), config); 
    } 

    @Override 
    public GalleryOpener galleryOpener() { 
     return this; 
    } 

    @Override 
    public void openGallery() { 
     selectedImagePath = null; 

     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select Image"), SELECT_IMAGE_CODE); 
    } 

    @Override 
    public String getSelectedImagePath() { 
     return selectedImagePath; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK && requestCode == SELECT_IMAGE_CODE) { 
      Uri imageUri = data.getData(); 
      selectedImagePath = getPath(imageUri); 
     } 
     //super.onActivityResult(requestCode, resultCode, data); 
    } 

    private String getPath(Uri uri) { 
     if (uri.getScheme().equalsIgnoreCase("file")) { 
      return uri.getPath(); 
     } 

     Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null); 
     if (cursor == null) { 
      return null; 
     } 

     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 

     String filePath = cursor.getString(column_index); 
     cursor.close(); 

     return filePath; 
    } 
} 

Используя это может выглядеть так:

galleryOpener.openGallery(); 
String selectedImagePath = galleryOpener.getSelectedImagePath(); 
if (selectedImagePath != null) { 
    FileHandle fileHandle = Gdx.files.absolute(selectedImagePath); 
    Texture texture = new Texture(fileHandle); 
} 
+0

Спасибо за быстрый ответ! Я проверю его сразу и дам вам знать, как это происходит! – coffeenet

+0

Я добавил это в свой код. Однако galleryOpener.openGallery() открывает галерею на моем устройстве, но поток приложения продолжается прямо до следующего кода, не дожидаясь, когда я выберу фотографию; таким образом, сбой «batch.beging() texture = null». Как я могу заставить метод openGallery дождаться, когда я выберу фотографию, прежде чем возвращать элемент управления обратно в String selectedImagePath = galleryOpener.getSelectedImagePath(); линия? – coffeenet

+0

Я все еще застрял ... Элемент управления просто не дожидался, когда пользователь выберет изображение в галерееОпеннер, прежде чем он вернется в цикл рендеринга. Он просто продолжает сбой с нулевым указателем. Я боюсь, что этот ответ не работает. – coffeenet

Смежные вопросы