비트 맵을 파일로 변환


127

을 사용 BitmapFactory하면 파일을 비트 맵으로 변환 할 수 있다는 것을 알고 있지만 비트 맵 이미지를 파일로 변환하는 방법이 있습니까?

답변:


82

이 시도:

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

이것 좀 봐


10
그러나 나는 FileOutputStream, 단지 파일을 원하지 않습니다 . 이 문제를 해결할 방법이 있습니까?
Mxyk

9
또한 무엇 quality입니까?
Mxyk

1
FileOutputStream은 파일에 쓰는 방법입니다. 참조 developer.android.com/reference/java/io/FileOutputStream.html
Torid

무슨 뜻인지 모르겠네요 ... FileOutputStream을 사용하여 파일을 만듭니다. 그리고 파일 인스턴스 (amsiddh의 예에서와 같이)를 사용하여 비트 맵을 내보낼 수있는 FileOutputStream을 만들 수 있습니다. 그 (파일 인스턴스, 파일 시스템의 실제 파일 및 FileOutputStream)로 필요한 모든 것을 갖추어야합니다.
P.Melch

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
플러시 잊지과 출력 스트림 :) 닫지 마십시오
벤 네덜란드

3
코드는 잘 작동하지만 압축 방법은 많은 시간이 걸립니다. 해결 방법이 있습니까?
만세 안녕

10
사람들이 품질 측정 항목이 무엇인지 궁금해 할 수 있습니다. 0에서 100까지의 배율이며 포토샵 내보내기 등과 유사합니다. 언급했듯이 PNG에서는 무시되지만을 사용하는 것이 좋습니다 CompressFormat.JPEG. Google doco 에 따르면
wired00

3
캐시 디렉토리의 파일이 자동으로 삭제됩니까?
Shajeel Afzal

1
왜를 사용하고 ByteArrayOutputStream그로부터 바이트 배열을 얻은 다음 배열을 FileOutputStream? 왜 단지 FileOutputStream에서 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 : 열기 실패 : EROFS (읽기 전용 파일 시스템)
Prasad

1
@Prasad는 File()생성자에 올바른 경로를 전달했는지 확인하십시오 .
fraggjkee

기본 경로가 있습니까?
Nathiel 바로스

완벽한 솔루션
Xan

bitmap.compress는 무엇입니까? 이 함수가 JPEG 형식을 제공하는 이유는 무엇입니까? 그리고 100은 무엇입니까?
roghayeh hosseini

11

변환 BitmapFile의 요구는 배경 (NOT IN 주요 나사산)는 특별히 경우 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"예외가 발생합니다. 왜 이런 일이 발생하는지 아직 조사 중입니다. 또한 어쩌면 당신은 JPG보다 .WEBP 확장과 그 주변 40~50% 작은 크기를 책략을 저장 고려해야한다
Pranaysharma

캐시에 저장 한 후 어떻게 든 캐시 (아마도 다른 응용 프로그램 삭제 캐시를 얻을 수있다 많은 방법 등)를 클리어 할 때 나는 @Pranaysharma "FileNotFound는"예외가 발생 가정
모하메드 Embaby

생성자 뒤에 execute ()가 누락되지 않았습니다. new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza 2018

1
@AndreaLeganza 예, 누락되었습니다. 감사합니다.
Mohamed Embaby

Contex를 AsyncTask에 유지하면 메모리 누수가 발생할 수 있습니다 !!! 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

이것이 도움이되기를 바랍니다.

class 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.