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

Imageview에 BlendMode 적용하기 문의 드립니다.!!!!

0 추천

안녕하세요. Imageview에 BlendMode.Screen 설정 관련하여 문의 드립니다.

위의 원본 이미지 처럼 BlendMode.Screen설정이 되어있는 이미지를 ImageView에 불러오고

필터효과를 주어 완료 이미지 처럼 보여주려고 합니다.

3개의 방법으로 적용해 보았고 소스는 아래와 같습니다.

1. android.graphics.BlendMode (https://developer.android.com/reference/android/graphics/BlendMode)

 xml 방법으로도 해보았습니다.

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.color_transparent); // #00000000
instances.stickerImageView.setImageTintList(csl);
instances.stickerImageView.setImageTintBlendMode(BlendMode.SCREEN);

2. ColorFilter 적용

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
drawable.setColorFilter(Color.parseColor("#00000000"), PorterDuff.Mode.SCREEN);

3. android.graphics.PorterDuff (https://developer.android.com/reference/android/graphics/PorterDuff.Mode)

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.filter_7);
Bitmap output = Bitmap.createBitmap(
        bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
PorterDuff.Mode mode = PorterDuff.Mode.SCREEN;
paint.setXfermode(new PorterDuffXfermode(mode));
canvas.drawBitmap(bitmap, rect, rect, paint);

특이한점은 1, 2번 방법은 색상을 지정 (빨간색)하면 필터효과가 적용됩니다. 위의 빨간 이미지 처럼요.

하지만 저는 색상지정을 하지 않고 처리가 되어야 합니다. 투명값 (#00000000)을 지정한 이유도 이러한 이유 입니다.

3번 방법은 아무런 효과가 적용되지 않았습니다.

어떤점이 잘못된 것일까요...몇일째 시도중이만 해결을 못하고 있습니다.

작은 조언이라도 좋으니 아시는 부분이 있으면 조언 부탁 드립니다.

감사합니다.

 

 

덕이 (450 포인트) 님이 2021년 2월 21일 질문

1개의 답변

0 추천
Overlay로 하면 어떻게 되나요?

OpenCV로만 해 봐서, 정확하진 않지만,
개념은 이렇습니다.
요청하는 개념은 두개의 이미지의 컬러를 더하는 것에 가깝습니다.
하단의 RGB위에 RGB로 덧칠을 해야 합니다.

ARGB_8888로 하면 안되고 RGB_888로 해야 하지 않나 하는 생각입니다.
A(lpha)는 투명이기 때문에, 투명을 덮으면, 다 투명해 지는 상황이 되니까,
밑에 깔리는 그림은 RGB여야 할 겁니다.
ARGB --> RGB로 바꾸고 Overlay로 해야 두개의 색이 섞이는 개념이죠.

샘플을 보면, 투명영역과 반투명 영역이 있습니다.
완전 투명영역ARGB을 RGB로 바꾸면 0,0,0 이기때문에,
기존 RGB에 더해도 그대롭니다.
기존 RGB에 값을 더하는 것은 Overlay로 보입니다.

그리고 추가적으로 문제가 될 수 있는 부분은
bitmap은 사이즈가 있다는 것입니다.
원본 이지가 1K * 2K일 수도 2K * 4K 일 수도 있죠.
그런데, 효과는 512 * 1024 일 수도 있죠.

ImageView는 확대가 가능하므로 다같이 보일 수 있어도,
Bitmap은 정확한 사이즈대로 연산이 됩니다.
따라서 두개을 겹칠려면, 두개의 Bitmap의 Height와 Width를 맞추어야 합니다.
Will Kim (43,170 포인트) 님이 2021년 2월 23일 답변
...