ビットマップをファイルに変換


127

を使用BitmapFactoryしてファイルをビットマップに変換できることを理解していますが、ビットマップ画像をファイルに変換する方法はありますか?

回答:


82

これを試して:

bitmap.compress(Bitmap.CompressFormat.PNG, quality, outStream);

これを見て


10
しかし、私はは必要ありませんFileOutputStream。ファイルだけです。これを回避する方法はありますか?
Mxyk、2011年

9
また、何qualityですか?
Mxyk、2011年

1
FileOutputStreamは、ファイルへの書き込み方法です。developer.android.com/reference/java/io/FileOutputStream.htmlを
Torid

どういう意味かわかりません... FileOutputStreamを使用してファイルを作成します。また、Fileインスタンス(amsiddhの例のように)を使用して、ビットマップをエクスポートできるFileOutputStreamを作成できます。これで(Fileインスタンス、ファイルシステム上の実際のファイル、およびFileOutputStream)、必要なものがすべて揃ったはずです。
P.Melch、2011年

235

それがあなたを助けることを願っています:

//create a file to write bitmap data
File f = new File(context.getCacheDir(), filename);
f.createNewFile();

//Convert bitmap to byte array
Bitmap bitmap = your bitmap;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();

//write the bytes in file
FileOutputStream fos = new FileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();

36
出力ストリームをフラッシュして閉じることを忘れないでください:)
Ben Holland

3
コードは正常に動作しますが、圧縮方法には多くの時間がかかります。回避策はありますか?
Shail Adi 2013

10
人々が品質指標とは何かを疑問に思っている場合。0から100までのスケールで、photoshopエクスポートなどと同様に高です。前述のように、PNGでは無視されますが、を使用することもできますCompressFormat.JPEG。google docoのとおり:コンプレッサーへのヒント、0-100。0は小さいサイズの圧縮を意味し、100は最高品質の圧縮を意味します。ロスレスのPNGなど一部の形式では、品質設定が無視されます
ワイヤード00

3
キャッシュディレクトリのファイルは自動的に削除されますか?
Shajeel Afzal

1
なぜを使用ByteArrayOutputStreamし、そこからバイト配列を取得して、配列をaに書き込みFileOutputStreamますか?なぜFileOutputStreamインだけではないのBitmap.compressですか?
InsanityOnABun 2017

39
File file = new File("path");
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();

java.io.FileNotFoundException:/ path:open failed:EROFS(Read-only file system)
Prasad

1
@Prasadは、File()コンストラクタに正しいパスを渡すようにしてください。
fraggjkee

デフォルトのパスがありますか?
Nathiel Barros 2017

完璧なソリューション
Xan

bitmap.compressとは何ですか?なぜこの関数はJPEG形式を与えるのですか?そして100は何ですか?
roghayeh hosseini

11

変換BitmapFileあれば(NOT IN THE MAINスレッド)がバックグラウンドで実行する必要があり、それは特別なUIをハングbitmap大きかったです

File file;

public class fileFromBitmap extends AsyncTask<Void, Integer, String> {

    Context context;
    Bitmap bitmap;
    String path_external = Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg";

    public fileFromBitmap(Bitmap bitmap, Context context) {
        this.bitmap = bitmap;
        this.context= context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // before executing doInBackground
        // update your UI
        // exp; make progressbar visible
    }

    @Override
    protected String doInBackground(Void... params) {

        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
        try {
            FileOutputStream fo = new FileOutputStream(file);
            fo.write(bytes.toByteArray());
            fo.flush();
            fo.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }


    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // back to main thread after finishing doInBackground
        // update your UI or take action after
        // exp; make progressbar gone

         sendFile(file);

    }
}

それを呼び出す

new fileFromBitmap(my_bitmap, getApplicationContext()).execute();

fileinを使用する必要がありますonPostExecute

fileキャッシュに保存するディレクトリを変更するには、次の行を置き換えます。

 file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");

と:

file  = new File(context.getCacheDir(), "temporary_file.jpg");

1
これにより、「FileNotFound」例外が発生することがあります。これがなぜ起こるか私はまだ調査中です。また、.webp拡張子を使用してワイルをJPGよりも約40〜50%小さいサイズで保存することを検討する必要があります
Pranaysharma

キャッシュに保存して、どういうわけかキャッシュがクリアされると、「FileNotFound」例外が発生すると思います(キャッシュをクリアする方法はたくさんあります。おそらく別のアプリケーションによって)@Pranaysharma
Mohamed Embaby

コンストラクタの後のexecute()が欠落していない:new fileFromBitmap(my_bitmap、getApplicationContext()); ?
Andrea Leganza 2018年

1
@AndreaLeganzaはい、欠けていました。私はあなたのおかげで私の回答を編集しました。
Mohamed Embaby 2018年

AsyncTaskでContexを保持すると、メモリリークが発生する可能性があります!!! youtube.com/watch?v=bNM_3YkK2Ws
slaviboy

2

ほとんどの回答は長すぎるか短すぎるため、目的を達成できません。ビットマップをファイルオブジェクトに変換するJavaまたはKotlinコードを探している方のために。これは私がこのトピックについて書いた詳細な記事です。Androidでビットマップをファイルに変換する

public static File bitmapToFile(Context context,Bitmap bitmap, String fileNameToSave) { // File name like "image.png"
        //create a file to write bitmap data
        File file = null;
        try {
            file = new File(Environment.getExternalStorageDirectory() + File.separator + fileNameToSave);
            file.createNewFile();

//Convert bitmap to byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 0 , bos); // YOU can also save it in JPEG
            byte[] bitmapdata = bos.toByteArray();

//write the bytes in file
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bitmapdata);
            fos.flush();
            fos.close();
            return file;
        }catch (Exception e){
            e.printStackTrace();
            return file; // it will return null
        }
    }

0

これがあなたを助けることを願っています

クラスMainActivity:AppCompatActivity(){

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Get the bitmap from assets and display into image view
    val bitmap = assetsToBitmap("tulip.jpg")
    // If bitmap is not null
    bitmap?.let {
        image_view_bitmap.setImageBitmap(bitmap)
    }


    // Click listener for button widget
    button.setOnClickListener{
        if(bitmap!=null){
            // Save the bitmap to a file and display it into image view
            val uri = bitmapToFile(bitmap)
            image_view_file.setImageURI(uri)

            // Display the saved bitmap's uri in text view
            text_view.text = uri.toString()

            // Show a toast message
            toast("Bitmap saved in a file.")
        }else{
            toast("bitmap not found.")
        }
    }
}


// Method to get a bitmap from assets
private fun assetsToBitmap(fileName:String):Bitmap?{
    return try{
        val stream = assets.open(fileName)
        BitmapFactory.decodeStream(stream)
    }catch (e:IOException){
        e.printStackTrace()
        null
    }
}


// Method to save an bitmap to a file
private fun bitmapToFile(bitmap:Bitmap): Uri {
    // Get the context wrapper
    val wrapper = ContextWrapper(applicationContext)

    // Initialize a new file instance to save bitmap object
    var file = wrapper.getDir("Images",Context.MODE_PRIVATE)
    file = File(file,"${UUID.randomUUID()}.jpg")

    try{
        // Compress the bitmap and save in jpg format
        val stream:OutputStream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream)
        stream.flush()
        stream.close()
    }catch (e:IOException){
        e.printStackTrace()
    }

    // Return the saved bitmap uri
    return Uri.parse(file.absolutePath)
}

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.