将位图保存到位置

Chr*_*pix 457 android bitmap save

我正在开发一个功能,从Web服务器下载图像,将其显示在屏幕上,如果用户希望保留图像,请将其保存在某个文件夹中的SD卡上.是否有一种简单的方法来获取位图并将其保存到我选择的文件夹中的SD卡?

我的问题是我可以下载图像,将其作为位图显示在屏幕上.我能够找到将图像保存到特定文件夹的唯一方法是使用FileOutputStream,但这需要一个字节数组.我不确定如何从Bitmap转换(如果这是正确的方法)到字节数组,所以我可以使用FileOutputStream来写入数据.

我有另一个选择是使用MediaStore:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
Run Code Online (Sandbox Code Playgroud)

哪个可以保存到SD卡,但不允许您自定义文件夹.

Ulr*_*ler 899

try (FileOutputStream out = new FileOutputStream(filename)) {
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • 有人*要*重新压缩吗?我只是想保存原始图像. (38认同)
  • 我也将图像压缩到了100%,当我在画布上获取图像时,它非常小.任何原因? (10认同)
  • @Aizaz这不会改变图像的大小,只会改变格式和(可能)质量.值得注意的是,上面示例中的压缩质量"90"在保存为PNG时不会产生任何影响,但会对JPEG产生影响.对于JPEG,您可以选择0到100之间的任何数字. (3认同)
  • @HeinduPlessis不必,但你可能应该.保存原始位图将占用更多空间,具体取决于格式(例如ARGB_4444与ARGB_8888). (2认同)
  • 当然,最好使用上下文来获取正确的路径,以确保更改时的正确位置: FileOutputStream out = context.openFileOutput(filename, Context.MODE_PRIVATE); 其中 private 不是 SDCARD 位置。 (2认同)
  • 如何取回图像 (2认同)

Joa*_*inG 131

您应该使用该Bitmap.compress()方法将位图保存为文件.它将压缩(如果使用的格式允许)你的图片并将其推入OutputStream.

下面是一个通过getImageBitmap(myurl)它获得的Bitmap实例的示例,可以压缩为压缩率为85%的JPEG:

// Assume block needs to be inside a Try/Catch block.
String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
Integer counter = 0;
File file = new File(path, "FitnessGirl"+counter+".jpg"); // the File to save , append increasing numeric counter to prevent files from getting overwritten.
fOut = new FileOutputStream(file);

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate
fOut.flush(); // Not really required
fOut.close(); // do not forget to close the stream

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
Run Code Online (Sandbox Code Playgroud)

  • 康塔多?那是什么? (5认同)
  • 您应该将措辞从“85% 的压缩率”更改为“85% 的质量率”以减少歧义。我会将“85% 的压缩率”解释为“15% 的质量”,但 `Bitmap.compress` 的 int 参数指定了质量。 (2认同)

小智 37

outStream = new FileOutputStream(file);
Run Code Online (Sandbox Code Playgroud)

将在未经许可的情况下在AndroidManifest.xml中抛出异常(至少在os2.2中):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

  • 如果您的文件absolutePath是内部路径,那该不是吗? (10认同)

小智 23

内部onActivityResult:

String filename = "pippo.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

Bitmap bitmap = (Bitmap)data.getExtras().get("data");
try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • 你称之为"pippo.jpg",但你正在使用PNG压缩 (7认同)

shi*_*dev 13

某些格式,如无损的PNG,将忽略质量设置.

  • PNG仍然是压缩格式.质量设置是否不会修改压缩质量? (2认同)

A-D*_*ech 9

以下是将位图保存到文件的示例代码:

public static File savebitmap(Bitmap bmp) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 60, bytes);
    File f = new File(Environment.getExternalStorageDirectory()
            + File.separator + "testimage.jpg");
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
    fo.close();
    return f;
}
Run Code Online (Sandbox Code Playgroud)

现在调用此函数将位图保存到内部存储器.

File newfile = savebitmap(bitmap);

我希望它会对你有所帮助.快乐的编码生活.


Ash*_*and 8

Bitmap bbicon;

bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10);
//ByteArrayOutputStream baosicon = new ByteArrayOutputStream();
//bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon);
//bicon=baosicon.toByteArray();

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
OutputStream outStream = null;
File file = new File(extStorageDirectory, "er.PNG");
try {
    outStream = new FileOutputStream(file);
    bbicon.compress(Bitmap.CompressFormat.PNG, 100, outStream);
    outStream.flush();
    outStream.close();
} catch(Exception e) {

}
Run Code Online (Sandbox Code Playgroud)


Tof*_*eer 7

为什么不用Bitmap.compress100 调用方法(这听起来像是无损的)?

  • JPEG,FWIW并非100%无损。您可以通过重复加载和保存位图来验证这一点。 (2认同)

Vah*_*yan 6

我知道这个问题很老,但现在我们可以在WRITE_EXTERNAL_STORAGE未经许可的情况下达到相同的结果。而不是我们可以使用文件提供程序。

private fun storeBitmap(bitmap: Bitmap, file: File){
        requireContext().getUriForFile(file)?.run {
            requireContext().contentResolver.openOutputStream(this)?.run {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, this)
                close()
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何从提供程序检索文件?

fun Context.getUriForFile(file: File): Uri? {
        return FileProvider.getUriForFile(
            this,
            "$packageName.fileprovider",
            file
        )
    }
Run Code Online (Sandbox Code Playgroud)

也不要忘记provider在 Android 中注册您的manifest

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
    </provider>
Run Code Online (Sandbox Code Playgroud)


小智 5

我还想保存一张照片.但我的问题(?)是我想从我绘制的位图中保存它.

我这样做了:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.save_sign:      

                myView.save();
                break;

            }
            return false;    

    }

public void save() {
            String filename;
            Date date = new Date(0);
            SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss");
            filename =  sdf.format(date);

            try{
                 String path = Environment.getExternalStorageDirectory().toString();
                 OutputStream fOut = null;
                 File file = new File(path, "/DCIM/Signatures/"+filename+".jpg");
                 fOut = new FileOutputStream(file);

                 mBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                 fOut.flush();
                 fOut.close();

                 MediaStore.Images.Media.insertImage(getContentResolver()
                 ,file.getAbsolutePath(),file.getName(),file.getName());

            }catch (Exception e) {
                e.printStackTrace();
            }

 }
Run Code Online (Sandbox Code Playgroud)


Jul*_*oud 5

我发现发送PNG和透明度的方式.

String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/CustomDir";
File dir = new File(file_path);
if(!dir.exists())
  dir.mkdirs();

String format = new SimpleDateFormat("yyyyMMddHHmmss",
       java.util.Locale.getDefault()).format(new Date());

File file = new File(dir, format + ".png");
FileOutputStream fOut;
try {
        fOut = new FileOutputStream(file);
        yourbitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
     } catch (Exception e) {
        e.printStackTrace();
 }

Uri uri = Uri.fromFile(file);     
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
intent.putExtra(Intent.EXTRA_STREAM, uri);

startActivity(Intent.createChooser(intent,"Sharing something")));
Run Code Online (Sandbox Code Playgroud)


Bha*_*ani 5

将位图保存到图库而不压缩。

private File saveBitMap(Context context, Bitmap Final_bitmap) {
    File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Your Folder Name");
    if (!pictureFileDir.exists()) {
        boolean isDirectoryCreated = pictureFileDir.mkdirs();
        if (!isDirectoryCreated)
            Log.i("TAG", "Can't create directory to save the image");
        return null;
    }
    String filename = pictureFileDir.getPath() + File.separator + System.currentTimeMillis() + ".jpg";
    File pictureFile = new File(filename);
    try {
        pictureFile.createNewFile();
        FileOutputStream oStream = new FileOutputStream(pictureFile);
        Final_bitmap.compress(Bitmap.CompressFormat.PNG, 100, oStream);
        oStream.flush();
        oStream.close();
        Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue saving the image.");
    }
    scanGallery(context, pictureFile.getAbsolutePath());
    return pictureFile;
}
private void scanGallery(Context cntx, String path) {
    try {
        MediaScannerConnection.scanFile(cntx, new String[]{path}, null, new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue scanning gallery.");
    }
}
Run Code Online (Sandbox Code Playgroud)