마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ColorFilter 적용된 Drawable 을 파일로 저장하기

0 추천

카메라로 부터 사진을 찍어 byte array 로 받은 수 drawable 로 변환시킨 뒤

ColorFilter 를 적용하여 이미지를 파일로 저장하려고 합니다.

오류는 없는데, ColorFilter 가 적용되지 않는 원본만 저장이 됩니다.

ColorFilter 에 의해 변경된 Drawable 은 어떻게 저장하면 되나요?

도와주세요...

Camera.PictureCallback mPicture = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] bytes, Camera camera) {
            mView.mRenderer.restartPreview();
            String storageDir = Environment.getExternalStorageDirectory().getAbsolutePath()
                    + "/" + Environment.DIRECTORY_DCIM + "/Camera";
            File dir = new File(storageDir);

            if (!dir.exists()) dir.mkdir();

            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String path = storageDir + "/IMG_" + timeStamp + ".jpg";

            File file = new File(path);
            try {
                ColorMatrix matrix = new ColorMatrix(new float[] {
                        1, 0, 0, 0, mView.mRenderer.mTest,
                        0, 1, 0, 0, mView.mRenderer.mTest,
                        0, 0, 1, 0, mView.mRenderer.mTest,
                        0, 0, 0, 1, 0
                });
                
                Drawable image = new BitmapDrawable(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
                image.setColorFilter(new ColorMatrixColorFilter(matrix));
                Bitmap bitmap = ((BitmapDrawable)image).getBitmap();
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                byte[] bytedata = stream.toByteArray();

                FileOutputStream fos = new FileOutputStream(file);
                fos.write(bytedata);
                fos.flush();
                fos.close();

                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                Uri uri = Uri.parse("file://" + path);
                intent.setData(uri);
                sendBroadcast(intent);
            }
            catch (Exception e) {
                Log.e("CheckLog", e.getMessage());
                return;
            }
        }
    };

위 코드에서 mView.mRenderer.mTest 는 시크바에 의해 변경되는 값 입니다.

익명사용자 님이 2016년 8월 29일 질문
제가 올린 질문인데 익명사용자로 올라갔었네요. ^^; StackOverFlow 에 올렸던 같은 질문에 답이 달려서 링크 남겨요.
http://stackoverflow.com/questions/39199378/how-to-save-drawable-after-setcolorfilter-on-android
아래 답변주신 분께도 감사드립니다.

1개의 답변

+1 추천
필터 설정만 되었을 뿐, 실제 source이미지에 적용된게 아니기 때문에,

변경 저장이 안되는 것으로  canvas에 draw하신 후  canvas에서 bitmap을 구해 저장하셔야 합니다.
익명사용자 님이 2016년 8월 29일 답변
...