1. 이미지를 Bitmap으로 변환

1. 안드로이드 리소스를 Bitmap으로 변환

1
2
// drawable에 있는 리소스를 BitmapFactory를 이용해 bitmap 작성
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_guest, options);
cs

 

2. 파일을 Bitmap으로 변환

1
2
3
4
// File의 이미지를 BitmapFactory를 이용해 Bitmap 작성
File file = new File(filePath, fileName);
FileInputStream fileInputStream = new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeFile(filePath + "/" + fileName);
cs

 

인터넷에서 이미지 다운로드는 이쪽으로 : https://puzi.tistory.com/31

 

[안드로이드]이미지 다운로드

메인 쓰레드는 이미지 다운로드 동안 기다릴 수 없기 때문에 AsynkTask로 작성한다. 그리고 리스너를 달아주어 다운로드 완료 후 처리를 하도록한다. ImageUrlDown.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1..

puzi.tistory.com

 

2. Bitamp을 byte로 저장 후 Base64로 encoding

1
2
3
4
5
6
// BytArrayOutputStream을 이용해 Bitmap 인코딩
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
// 인코딩된 ByteStream을 String으로 획득
byte[] image = byteArrayOutputStream.toByteArray();
String byteStream = Base64.encodeToString(image, 0);
cs

 

3. html의 자바스크립트를 호출하여 Base64를 넘겨줌

1
2
3
// ByteStream을 자바스크립트를 이용해 전달
binding.mainWebView.loadUrl("javascript:setImageByteCode('data:image/png;base64," + byteStream + "')");
 
cs

 

4. 넘겨받은 Base64값으로 이미지 출력

<HTML>

1
2
3
4
5
6
7
8
9
10
    <head>
        <script id="applicationScript">
            function setImageByteCode(byteCode) {
                document.getElementById("photo").src = byteCode;
            }
        </script>
    </head>
    <body>
        <img id = "photo" src = "trans.png" title="picture">        
    </body>
cs

 

메인 쓰레드는 이미지 다운로드 동안 기다릴 수 없기 때문에 AsynkTask로 작성한다.

그리고 리스너를 달아주어 다운로드 완료 후 처리를 하도록한다.

 

ImageUrlDown.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.example.test_html_bytecode;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
 
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
 
public class ImageUrlDown extends AsyncTask<StringString, Bitmap> {
    // 다운로드 완료 후 호출 할 리스너
    public interface OnPostDownLoadListener {
        void onPost(Bitmap bitmap);
    }
 
    private Bitmap bitmap = null;
    private OnPostDownLoadListener onPostDownLoad;
 
    // 리스너 세팅
    public ImageUrlDown(OnPostDownLoadListener paramOnPostDownLad) {
        onPostDownLoad = paramOnPostDownLad;
    }
    
    @Override
    protected Bitmap doInBackground(String... strings) {
        try {
            // 파라미터로 받은 url로 부터 이미지 다운로드
            bitmap = BitmapFactory.decodeStream((InputStream) new URL(strings[0]).getContent());
            return bitmap;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        // 이미지 다운로드 완료 후 리스너 호출
        if (onPostDownLoad != null)
            onPostDownLoad.onPost(bitmap);
    }
}
 
cs

 

호출은 아래와 같이한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private void downloadImage() {
        String imageURL = "http://puzi.tistory.com/image.png"//이미지 URL
        // 이미지 다운로드 클래스 생성 및 리스너 작성
        ImageUrlDown imageUrlDown = new ImageUrlDown((bitmap) -> {
            try {
                // 파일 생성
                File file = new File(filePath,fileName);
                // 아웃풋 스트림 생성
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                // 아웃풋 스트림 작성
                bitmap.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);
                // 아웃풋 스트림 출력
                fileOutputStream.flush();
                // 아웃풋 스트림 종료
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        // url 전달
        imageUrlDown.execute(imageURL);
    }
cs

참고 : https://lannstark.tistory.com/34?category=840464 

 

Java InputStream이란?

InputStream OutputStream을 실무에서 사용할 때면, 뭔가 알긴 알고 실제로 둘을 활용해 기능을 구현하는데는 전혀 문제가 없지만, 사용할때마다 찾아보게되고 뭔가 정확히 아는 것 같지는 않다라는 느

lannstark.tistory.com

 

+ Recent posts