Преобразовать растровое изображение в файл - PullRequest
109 голосов
/ 14 октября 2011

Я понимаю, что использование BitmapFactory может преобразовать файл в растровое изображение, но есть ли способ преобразовать растровое изображение в файл?

Ответы [ 4 ]

211 голосов
/ 15 октября 2011

Надеюсь, это поможет вам:

//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();
74 голосов
/ 14 октября 2011

Попробуйте это:

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

См. Это

33 голосов
/ 31 июля 2015
File file = new File("path");
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
7 голосов
/ 05 августа 2017

Преобразование Bitmap в File необходимо выполнить в фоновом режиме (НЕ В ГЛАВНОЙ РЕЗЬБЕ), в частности, пользовательский интерфейс зависает, особенно если 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();

вы ДОЛЖНЫ использовать file в onPostExecute.

Чтобы изменить каталог file для хранения в кеше заменить строку:

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

с:

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