본문 바로가기
안드로이드 자바

[JAVA][Android] 비트맵 string으로 변환하기

by teamnova 2021. 11. 14.
728x90

안녕하세요.

오늘은 이미지(bitmap)를 string으로 변환하고, 다시 string을 이미지(bitmap)로 변환시키는 방법에 대해

배워보도록 하겠습니다.

 

먼저 예제부터 생성하겠습니다.

 

1. 레이아웃 ( activity_main.xml )

레이아웃은 아래와 같이 만들었어요.

스크롤뷰를 사용한 이유는 제가 사용한 이미지가 조금 길어서, 이미지를 넣으면, 화면이 잘려서 그랬습니다

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layoutDescription="@xml/activity_main_scene"
    tools:context=".MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingHorizontal="10dp">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:text="1. 원본 이미지"
                android:textColor="@color/black"
                android:textSize="24sp" />

            <ImageView
                android:id="@+id/original_img_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/ic_launcher" />

            <TextView
                android:id="@+id/textView3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:text="2. 이미지를 string으로 변환"
                android:textColor="@color/black"
                android:textSize="24sp" />

            <TextView
                android:id="@+id/string_size"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="- String 길이 : "
                android:textColor="#D0000000"
                android:textSize="22sp" />

            <TextView
                android:id="@+id/textView2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:text="3.string을 변환한 이미지"
                android:textColor="@color/black"
                android:textSize="24sp" />

            <ImageView
                android:id="@+id/string_img_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/ic_launcher"/>
        </LinearLayout>
    </ScrollView>

    <Button
        android:id="@+id/change_btn"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="원본 이미지 가져오기" />


</LinearLayout>

레이아웃 결과

2. MainActivity

스틱코드를 사용하면, 비트맵을 string으로 변환하고, string을 비트맵으로 변환하는 메서드를 손쉽게 사용할 수 있어요.

사용법은 아래와 같습니다. 

 

https://stickode.com/detail.html?no=2571

 

스틱코드

 

stickode.com

R.drawable.sample_img 는 인터넷에서 무료이미지 다운받아서 사용했습니다. 

이미지 적당한거로 대체하시면 됩니다. 

public class MainActivity extends AppCompatActivity {

    ImageView oriImgView;
    ImageView stringImgView;
    TextView imgStringLengthTv;
    String imgString;
    Button changeBtn;
    int num = 0;
    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        oriImgView = findViewById(R.id.original_img_view);
        stringImgView = findViewById(R.id.string_img_view);
        imgStringLengthTv = findViewById(R.id.string_size);
        changeBtn = findViewById(R.id.change_btn);
        context = this;

        changeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (num) {
                    case 0: //원본 이미지뷰에 변환하려는 예시 이미지를 넣어준다.
                        oriImgView.setImageResource(R.drawable.sample_img);
                        changeBtn.setText("이미지를 스트링으로 변환하기");
                        break;
                    case 1: //원본 이미지를 string 으로 변환하고 ui 에 표시해줌
                        changeBtn.setText("진행중");
                        //1. res 에 존재하는 이미지를 bitmap 으로 가져온다.
                        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.sample_img);

                        //2. ImageBitmap 클래스의 메서드를 사용해서 bitmap 을 String 으로 변환한다.(시간이 걸릴 수 있음)
                        imgString = bitmapToString(bitmap);

                        //3. ui에 표시
                        String lengthText = "- String 길이 : "+imgString.length();
                        imgStringLengthTv.setText(lengthText);
                        changeBtn.setText("스트링을 이미지로 변환하기");
                        break;
                    case 2: //string 값을 이미지(bitmap)으로 재변환
                        changeBtn.setText("진행중");

                        Bitmap stringBitmap = stringToBitmap(imgString);
                        stringImgView.setImageBitmap(stringBitmap);
                        changeBtn.setText("완료됨");
                        break;
                    default:
                        break;
                } //switch
                num++;
            }
        });
    }
    
    /*스틱코드 추가부분 ~~~~*/

    //bitmap 을  string 형태로 변환하는 메서드 (이렇게 string 으로 변환된 데이터를 mysql 에서 longblob 의 형태로 저장하는식으로 사용가능)
    public String bitmapToString(Bitmap bitmap){
        String image = "";
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        image = Base64.getEncoder().encodeToString(byteArray);
        return image;
    }

    //string 을  bitmap 형태로 변환하는 메서드
    public Bitmap stringToBitmap(String data){
        Bitmap bitmap = null;
        byte[] byteArray = Base64.getDecoder().decode(data);
        ByteArrayInputStream stream = new ByteArrayInputStream(byteArray);
        bitmap = BitmapFactory.decodeStream(stream);
        return bitmap;
    }
    /*~~~~ 스틱코드 추가부분 */
}

 

시현