Câu trả lời:
quality
gì?
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();
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
ByteArrayOutputStream
, lấy một mảng byte từ đó, sau đó ghi mảng thành a FileOutputStream
? Tại sao không chỉ FileOutputStream
vào Bitmap.compress
?
File file = new File("path");
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
File()
.
Việc chuyển đổi Bitmap
thành File
cầ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 bitmap
lớ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 file
trong onPostExecute
.
Để thay đổi thư file
mụ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");
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
}
}
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)
}
}
FileOutputStream
, chỉ một File. Có cách nào để giái quyết vấn đề này không?