java 从图像视图将图像保存到图库

z4iuyo4d  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(172)

我尝试从图像视图将图像保存到画廊,但出现文件未找到异常错误
我尝试的代码,但得到文件未找到异常。
如果你听不懂我的英语,我很抱歉。

save.setOnClickListener(new View.OnClickListener(){

                @Override

                public void onClick(View v){

                    BitmapDrawable draw = (BitmapDrawable) mainImage.getDrawable();

                    Bitmap bitmap = draw.getBitmap();

                    try{

                        FileOutputStream outStream = null;

                        File sdCard = Environment.getExternalStorageDirectory();

                        File dir = new File(sdCard.getAbsolutePath() + "/MyFolder");

                        dir.mkdirs();

                        String fileName = String.format("%d.jpg", System.currentTimeMillis());

                        File outFile = new File(dir, fileName);

                        outStream = new FileOutputStream(outFile);

                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);

                        outStream.flush();

                        outStream.close();

                        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

                        intent.setData(Uri.fromFile(outFile));

                        sendBroadcast(intent);

                    }

                    catch (Exception e){

                        e.printStackTrace();

                        Toast.makeText(MainActivity.this,e.toString(),Toast.LENGTH_SHORT).show();

                    }

                }

        });

我是一个初学者,所以我不知道如何解决这个问题。请帮助我

mspsb9vt

mspsb9vt1#

“让我们从头开始"

**步骤1:**在清单中添加“读取”和“写入”权限
**第2步:**为ImageView中的图像制作位图
**第3步:**现在有一个不同的机制来保存文件在以下和以上Android版本Q
在下方Q:

private File saveBitmapBelowQ(Bitmap bitmap, String name) {
        File imageRoot = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM), appDirectoryName);
        if (!imageRoot.exists()) {
            imageRoot.mkdirs();
        }
        File image = new File(imageRoot, name + ".png");
        try {
            if (image.createNewFile()) {
                try (FileOutputStream fos = new FileOutputStream(image)) {
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.PNG,
                            100, bos);
                    byte[] bitmapdata = bos.toByteArray();
                    fos.write(bitmapdata);
                    fos.flush();
                    imagePath = image.getPath();
                }
                return image;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }

其中AppDirectory是您想要的目录名称,而name是偏好使用即时日期和时间的影像名称。在此方法中,
1.首先,在外部存储器中创建目录。
1.然后创建您的图像文件(尝试使其唯一)
1.最后一步是将位图转换为字节数组,并写入您在中创建的文件(第2点)

在Android Q及以上版本中:

@RequiresApi(api = Build.VERSION_CODES.Q)
    public File saveBitmapAboveQ(Bitmap bitmap, Context context, String directoryName, String name) {
        OutputStream fos;
        ContentResolver resolver = context.getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + directoryName);
        Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        try {
            fos = resolver.openOutputStream(imageUri);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();
            imagePath = new File(getPath(imageUri)).getAbsolutePath();
            return new File(getPath(imageUri));
        } catch (Exception e) {
            return null;
        }
    }

创建内容解析器并设置内容值(如文件名、类型和位置),然后将内容值传递给内容解析器,并将内容解析器传递给FileOutputStream/ OutputStream。现在,在输出流上写入位图
快乐编码

rdrgkggo

rdrgkggo2#

Kotlin方式:您可以使用此扩展功能将文件保存在存储器中

fun Bitmap.saveAsFile(isPng: Boolean = false): File? {
    val root = Environment.getExternalStorageDirectory()
    val myDir = File("${root}/pic")
    myDir.mkdirs()
    if (myDir.exists()) {
        val random = (Math.random() * (1024 - 1)).toLong()
        val prefix = "IMG${random}_${System.currentTimeMillis().toTimestamp()}"
        .replace(" ", "_")
        .replace(":", "-")

        val fileName = if (isPng) "$prefix.png" else "$prefix.jpg"
        val file = File(myDir, fileName)
    if (file.exists()) file.delete()
        return try {
            val out = FileOutputStream(file)
            if (isPng) {
                this.setHasAlpha(true)
                this.compress(Bitmap.CompressFormat.PNG, 100, out)
            } else {
                this.compress(Bitmap.CompressFormat.JPEG, 100, out)
            }
            out.flush()
            out.close()
            file
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }
  return null
}

样本使用:

val imageFile = view.drawToBitmap().saveAsFile()

相关问题