java - LibGDX : How to retrieve a picture that was taken through the camera and saved locally?

标签 java android camera libgdx load

我的应用程序做什么:

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- 应用程序使用 bmp.compress(quality=25) 将图片rescales+compresses 缩小到 1024x512,然后保存。 (有效)

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

注意事项:

最佳答案

我用 platform specific code 来做这件事.该接口(interface)在核心代码中使用。

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);
}

关于java - LibGDX : How to retrieve a picture that was taken through the camera and saved locally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34941921/

相关文章:

ios - iOS 6.1 中用于自定义相机 View 的自动旋转

ios - 在 iPhone/iOS 的浏览器上录制视频 (MediaRecorder)

Java:项目链表问题

java - REST Web 服务 Java-Tomcat 错误

java - 有没有办法使用 playframework 接受路由中的自定义对象?

android - 适用于 Android 的 SAXParser 工作示例

Java 解码 xml 元素

android - OSMDroid:onTap 示例

android - 如何将一个布局组件的高度设置为与另一个组件的高度相同?

python - 一次从 OpenCV 中的两个摄像头捕获视频