Chuyển đổi bitmap thành tệp


127

Tôi hiểu rằng việc sử dụng BitmapFactorycó thể chuyển đổi Tệp thành Bitmap, nhưng có cách nào để chuyển đổi hình ảnh Bitmap thành Tệp không?

Câu trả lời:


82

Thử cái này:

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

Xem này


10
Nhưng tôi không muốn một FileOutputStream, chỉ một File. Có cách nào để giái quyết vấn đề này không?
Mxyk

9
Ngoài ra, là qualitygì?
Mxyk

1
FileOutputStream là cách bạn ghi vào một tệp. Xem developer.android.com/reference/java/io/FileOutputStream.html
Torid

tôi thực sự không biết ý bạn là gì ... Bạn sử dụng FileOutputStream để tạo tệp. Và bạn có thể sử dụng một cá thể Tệp (như trong ví dụ về amsiddh) để tạo một FileOutputStream mà bạn có thể xuất bitmap sang. Với điều đó (một phiên bản Tệp, một tệp thực trên hệ thống tệp và FileOutputStream) bạn sẽ có mọi thứ bạn cần, phải không?
P.Melch

235

Hy vọng nó sẽ giúp bạn:

//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
đừng quên để tuôn ra và đóng dòng đầu ra của bạn :)
Bến Hà Lan

3
Mã hoạt động tốt, nhưng phương pháp nén mất rất nhiều thời gian. Bất kỳ công việc xung quanh?
Shail Adi

10
trong trường hợp mọi người đang tự hỏi Chỉ số chất lượng là gì. Nó có tỷ lệ từ 0 thấp đến 100, cao tương tự như xuất photoshop, v.v. Như đã đề cập, nó bị bỏ qua đối với PNG, nhưng bạn có thể muốn sử dụng CompressFormat.JPEG. Theo google doco: Gợi ý cho máy nén, 0-100. 0 nghĩa là nén cho kích thước nhỏ, 100 nghĩa là nén cho chất lượng tối đa. Một số định dạng, chẳng hạn như PNG không mất dữ liệu, sẽ bỏ qua cài đặt chất lượng
dây00

3
Tệp từ thư mục bộ nhớ cache sẽ tự động bị xóa?
Shajeel Afzal

1
Tại sao sử dụng a ByteArrayOutputStream, lấy một mảng byte từ đó, sau đó ghi mảng thành a FileOutputStream? Tại sao không chỉ FileOutputStreamvào Bitmap.compress?
InsanityOnABun

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 (Hệ thống tệp chỉ đọc)
Prasad

1
@Prasad đảm bảo rằng bạn chuyển một đường dẫn chính xác đến hàm tạo của mình File().
fraggjkee

Nó có một đường dẫn mặc định?
Nathiel Barros

giải pháp hoàn hảo
Xan

bitmap.compress là gì? tại sao hàm này cung cấp định dạng JPEG? và 100 là gì?
roghayeh hosseini

11

Việc chuyển đổi Bitmapthành Filecần phải được thực hiện ở chế độ nền (KHÔNG TRONG BỘ PHẬN CHÍNH), nó sẽ treo giao diện người dùng đặc biệt nếu giao diện người dùng bitmaplớn

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);

    }
}

Gọi nó

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

bạn PHẢI sử dụng filetrong onPostExecute.

Để thay đổi thư filemục được lưu trữ trong dòng thay thế bộ nhớ cache:

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

với :

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

1
Điều này mang lại cho tôi ngoại lệ "FileNotFound" một số lần. Tôi vẫn đang điều tra lý do tại sao điều này xảy ra. Cũng có lẽ bạn nên xem xét lưu mưu chước với .webp mở rộng kích thước nhỏ hơn khoảng 40-50% so với nó JPG
Pranaysharma

Tôi cho rằng "FileNotFound" ngoại lệ xảy ra khi lưu vào bộ nhớ cache sau đó bằng cách nào đó bộ nhớ cache sẽ bị xóa (có nhiều cách để có được bộ nhớ cache xóa, có lẽ bởi ứng dụng khác) @Pranaysharma
Mohamed Embaby

Không thiếu thực thi () sau hàm tạo: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza

1
@AndreaLeganza vâng, nó còn thiếu, tôi đã chỉnh sửa câu trả lời của mình, cảm ơn bạn.
Mohamed Embaby

Giữ Contex trong AsyncTask có thể dẫn đến rò rỉ bộ nhớ !!! youtube.com/watch?v=bNM_3YkK2Ws
nô lệ

2

Hầu hết các câu trả lời quá dài hoặc quá ngắn không đáp ứng được mục đích. Đối với những người đang tìm kiếm mã Java hoặc Kotlin để Chuyển đổi bitmap sang Đối tượng tệp. Đây là bài viết chi tiết tôi đã viết về chủ đề này. Chuyển đổi Bitmap sang Tệp trong 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

Hy vọng điều này sẽ giúp bạn

lớp 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)
}

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.