507

Webサーバーから画像をダウンロードして画面に表示し、ユーザーが画像を保持したい場合は、SDカードの特定のフォルダーに保存する機能に取り組んでいます。ビットマップを SD カードの任意のフォルダに保存する簡単な方法はありますか?

私の問題は、画像をダウンロードして、ビットマップとして画面に表示できることです。画像を特定のフォルダーに保存する唯一の方法は、FileOutputStream を使用することですが、これにはバイト配列が必要です。Bitmap からバイト配列に変換する方法が (これが正しい場合でも) わからないので、FileOutputStream を使用してデータを書き込むことができます。

私が持っている他のオプションは、 MediaStore を使用することです:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");

SDカードに保存するのはうまくいきますが、フォルダをカスタマイズすることはできません.

4

19 に答える 19

970
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();
}
于 2009-03-23T11:22:56.550 に答える
144

メソッドを使用しBitmap.compress()てビットマップをファイルとして保存する必要があります。画像を圧縮し (使用されている形式で許可されている場合)、OutputStream にプッシュします。

getImageBitmap(myurl)以下は、 85% の圧縮率で JPEG として圧縮できる、取得した Bitmap インスタンスの例です。

// 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());
于 2010-06-10T10:42:30.660 に答える
38
outStream = new FileOutputStream(file);

AndroidManifest.xml(少なくともos2.2では)で許可なく例外をスローします:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2011-10-14T22:57:43.923 に答える
28

内部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();
}
于 2012-01-25T16:19:22.717 に答える
13

ロスレスのPNGなどの一部の形式では、品質設定が無視されます。

于 2009-12-09T13:53:48.770 に答える
8

100でメソッドを呼び出してみませんかBitmap.compress(ロスレスのように聞こえます)?

于 2009-03-16T04:10:15.603 に答える
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) {

}
于 2011-06-22T09:25:25.767 に答える
6

写真も保存したいです。しかし、私の問題 (?) は、描画したビットマップから保存したいということです。

私はこのようにしました:

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

 }
于 2010-11-18T09:26:48.643 に答える
2

を呼び出す前に、ディレクトリが作成されていることを確認してくださいbitmap.compress

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
于 2016-02-18T19:21:39.040 に答える
2

ビデオのビデオ サムネイルを作成します。ビデオが破損している場合、またはフォーマットがサポートされていない場合は、null が返されることがあります。

private void makeVideoPreview() {
    Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND);
    saveImage(thumbnail);
}

ビットマップを SD カードに保存するには、次のコードを使用します。

店舗画像

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    } 
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

イメージ ストレージのパスを取得するには

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this. 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files"); 

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    } 
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
        String mImageName="MI_"+ timeStamp +".jpg";
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
    return mediaFile;
} 
于 2018-06-28T13:17:34.153 に答える
1

ちょっと.bmpに名前を付けてください

これを行う:

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
_bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.BMP" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
                        + File.separator + "**test.bmp**")

IM JUST FOOLING AROUNDのように聞こえるかもしれませんが、bmp形式で保存されるので一度試してみてください..乾杯

于 2013-01-22T11:47:39.097 に答える
1

Android 4.4 Kitkat以降、2017年時点でAndroid 4.4以下のシェアは約20%と減少傾向にあり、FileクラスやgetExternalStorageDirectory()メソッドを利用したSDカードへの保存はできません。このメソッドは、デバイスの内部メモリを返し、すべてのアプリに表示される画像を保存します。また、画像をアプリ専用に保存し、ユーザーがopenFileOutput()メソッドを使用してアプリを削除したときに削除することもできます。

Android 6.0 以降では、SD カードを内部メモリとしてフォーマットできますが、デバイスにのみプライベートに使用できます。他の回答がありますが、リムーバブル SD カードを使用する場合は、以下の私の回答をお読みください。

ストレージ アクセス フレームワークを使用して、ユーザーが選択したフォルダーを取得するアクティビティのフォルダー メソッドに uri を取得しonActivityResult、ユーザーがデバイスを再起動した後にフォルダーにアクセスできるように永続化可能なアクセス許可を取得する必要があります。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {

        // selectDirectory() invoked
        if (requestCode == REQUEST_FOLDER_ACCESS) {

            if (data.getData() != null) {
                Uri treeUri = data.getData();
                tvSAF.setText("Dir: " + data.getData().toString());
                currentFolder = treeUri.toString();
                saveCurrentFolderToPrefs();

                // grantUriPermission(getPackageName(), treeUri,
                // Intent.FLAG_GRANT_READ_URI_PERMISSION |
                // Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                final int takeFlags = data.getFlags()
                        & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            }
        }
    }
}

ここで、保存フォルダーを共有設定に保存して、画像を保存するたびにユーザーにフォルダーを選択するように求めないようにします。

またはではなく、クラスを使用DocumentFileして画像を保存する必要があります。詳細については、メソッドとクラスを使用してSDカードに画像を保存するためのこのスレッドを確認できます。FileParcelFileDescriptorcompress(CompressFormat.JPEG, 100, out);DocumentFile

于 2017-09-15T11:42:12.823 に答える