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

이미지 dp 해상도 대응 처리

0 추천
.단순히 mdpi~xxxhdpi 폴더에 넣는 그게 아니구용

서버에서 360*720, 360*900 등 딱 정해진 사이즈로 3가지 형태 이미지가 내려옵니다

3가지 사이즈 유형말고 내려올건 무조건 없구요 (관리자사이트에서 무조건 이사이즈만 등록하게 해놨고,

정책적으로도 정해서 다른 유형은 없습니다)

이 이미지를 이미지를 그냥 고정 dp로 박으면 기기별로 이미지가 분명 다르게 나올텐데

360*720 이면 widht*720/360? 이런 계산식이 있던거같은데 이런걸 어떻게 적용해야 되는건지..?

구글링해보려해도 키워드를 잡지못하네요 어떻게 하는건가요 이방식이..?

 

아니면 컨스트레인트레이아웃에 ratio로 비율설정하는방식으로는 안되는건가요?
수원통학러 (3,570 포인트) 님이 2021년 12월 25일 질문
수원통학러님이 2021년 12월 25일 수정
단위 변환
public static float dpToPx(float dp, Context context){
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

public static float pxToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

ConstraintLayout에 비율 사용(0.25를 필요한 비율로 대체)
app:layout_constraintHeight_percent="0.25"
app:layout_constraintWidth_percent="0.25"
360 720으로 내려오면 그냥 360:720으로 써도되는거죠? 저 메트릭스안쓰고용
서버에서 pixel 로 내려주는 거 아닌가요? 그럼 pxel 을 dp로 변환하셔야 실제 화면에 보여지는 사이즈를 알 수가 있겠죠. ImageView에 minWidht나 minHeight를 사용하는 것과 ratio를 보존하고 싶다면 adjustBounds="true" 해주셔야 할 거예요.
참고로 서버에서 내려오는 이미지 사이즈가 "절대" 변하지 않을 것이라거나 딱 3가지 사이즈밖에 없을 거야라고 가정하는 것은 안전하지 않습니다. 그런 종류의 요구사항은 비지니스의 상황에 따라 쉽게 바뀔 수 있습니다.
관리자사이트에서 아예 특정사이즈가 아니면 등록자체를 못하게 해놔서요
Adjustbound true랑 ratio를같이써야된다는건가요?
Px로 줍니당
pixel 은 커스텀뷰에서 직접  캔버스를 핸들링할 때 사용합니다. 그렇지않고 xml에 설정을 할 때는  dp로 하셔야 하구요. 그러니까 ImageView에 wrap_width가 아닌 특정 사이즈를 지정하시려면 서버에서 pixel로 리턴된 사이즈를 dp로 변환해서 LayoutParam.width, height를 하셔야 겠죠. 그리고 말씀드렸듯이  adjustBounds는 ratio를 유지할 때 사용합니다. ratio 자체를 설정하는 건 다른 이야기예요. 정확히 원하시는게 서버에서 리턴한 이미지를 디바이스에 관계없이 동일한 크기로 보이게 하시는 건지, 아니면 동일한 비율의 사이즈로 보이게 하려는 건지에 따라 ImageView의 핸들링이 좀 달라지겠죠.

(디바이스 density에 따른)
동일한 크기 - dp사용, LayoutParam.width, LayoutParam.height, adjustBounds, minWidth 조합.
동일한 비율 - app:layout_constraintHeight_percent, app:layout_constraintWidth_percent

ratio설정과 관련해서 아래 스택오버플로우 링크도 참조해 보세요.
https://stackoverflow.com/questions/48114568/load-image-with-glide-and-change-aspect-ratio/48114663

제 생각에는 디바이스의 화면 사이즈를 구하고(portrait라면 width가 되겠죠) 원본이미지를 화면 사이즈에 최적화되게 스케일 다운하시는 것이 어떨까 싶네요.

1개의 답변

0 추천
먼저 이미 그렇게 하고 계시겠지만, Glide나 Picasso 같은 이미지 라이브러리를 사용하세요. 이미지 스케일링, 스토리지 체크 등등  네트워크에서 이미지를 다운로드 받거나 큰 이미지를 다룰 때 해야할 일이 많기 때문에 라이브러리를 사용하는게 좋습니다.

그리고 하시려고 하는 의도에 따라, 아래의 옵션들을 적절하게 선택하세요. (먼저, 요구사항을 정확하게 정의해 보세요.)

모든 디바이스에서 xxx dp로 보여주고 싶으신 건지, 화면에 width/height만 꽉차게 보여주고 싶으신건지, 아니면 thumbnail처럼 작은 사이즈로 보여주시려고 하는 건지 등등의 요구사항에 따라 다르게 테스트를 해보시면 될 것 같아요.

화면에 이미지가 원래 원본과 같은 비율로 보이게 하시려면  wrap_width + adjustViewBounds를 사용하세요.

이미지를 특정 사이즈로 보이게 하고 싶으시면 wrap_width 대신에 원하는 크기의 dp를 사용하세요.

필요하다면, minWidth, minHeight, maxWidth, maxHeight 등의 속성을 통해 최소, 최대 이미지 사이즈를 조절하세요.

원본 이미지 자체의 스케일링을 컨트롤 하고 싶으시다면, 위에 있는 stackoverflow의 링크에 있는 코드들을 참조하세요.(예를 들면 폰에서는 원본 이미지가 크고, 태블릿의 경우 이미지가 작아서, 고정 dp를 사용할 수 없고 강제로 스케일업을 할 필요가 있거나 하다면)

마지막의 스케일을 조절하는 방법이 대부분의 경우에도 적용할 수 있는 방법일 거라는 생각이 듭니다. 디바이스 화면크기, 원하는 이미지 크기 등을 고려해서 최적하된 사이즈를 얻을 수 있으니까요.
spark (227,530 포인트) 님이 2021년 12월 26일 답변
현재 글라이드도 사용중인데 답변해주신 2가지 방법중 어떤걸 써야되는게 맞는지 모르겠어서 한번 설명드리자면
디자이너분이 360*720 360*900 하난 기억이 안나는데
딱 3가지 유형으로 디자인해서 등록을 합니다 (그외에는 이미지 등록이 안되므로)

그러면 안드로이드에선 각각 딱 그 크기의 이미지를 보여줄텐데
기기마다 해상도가 다를테니 딱 그 디자이너분이 등록한 이미지를 보여주면
가로가 360이면 그대로 보여줄경우엔 넓은 폴드폰같은 경우엔 분명히 가로가
남을거고.. 그럼 이경우에는 ratio 360:720 + adjustbound true인지
아니면 매트릭스를 사용해야하는지 궁금합니다
모든 디바이스에서 디바이스 화면 사이즈에 따라 일정한 여백만큼 보여지기 원하시는 거네요.

이미지뷰에 필요한 margin을 주셔서 match_parent로 해보시고, 이게 아니면

보여지길 원하는 이미지 width = 화면 width - 여백

를 구하신 다음 원본 이미지와 비교해서 원본이 크면 scale down하거나 작으면 scale up을 하셔야 할 것 같이 보이네요. 크기 계산이 들어가면 displayMatrics는 무조건 사용하셔야 할 거예요. 즉, 디바이스 화면 기준으로 원하는 사이즈를 계산해서, 이만큼 이미지를 줄이던가 늘리던가 하는거죠.

스크린 사이즈 구하기:
https://stackoverflow.com/questions/1016896/how-to-get-screen-dimensions-as-pixels-in-android

아래 github에 있는 라이브러리의 pinch to zoom과 기본적으로 같은 개념이라고 보시면 됩니다.
https://github.com/davemorrissey/subsampling-scale-image-view
...