2017-02-17 5 views
1

의 많은 PNG로 (여러 조각에 6-7 번 사용). 이미지 내 목적을 위해 작아야하기 때문에 내가 클릭 가능한 영역의 버튼 크기를 증가하지만 이미지를 유지할 수 있도록, 나는 이미지 주위 여분의 투명 영역에 넣어 내 이미지의 영역을 증가 작은 (나는 그 효율성이 좋지 않다는 것을 알고 있으며 그 이후로 나는 이것을 달성하기 위해 더 나은 방법을 고안했다.)거대한 스파이크 사용하여 내 응용 프로그램에서 CopyToClipboard 함수에 대한 <strong>PNG 배경</strong>으로 <strong>버튼</strong>을 사용하고 투명 영역

다른 이미지 (150kb 크기의 큰 이미지)를 업로드 할 때 나중에 커다란 스파이크가 발견되었고 많은 디버깅을 한 후에 (나는 많은 것을 의미합니다!) 나는 문제가 더 큰 심상 그러나 CopyToClipboard 심상 때문에 크기에서 다만 8kb의 !!! 이전 CopyToClipboard 이미지 (투명 영역이 적음)로 다시 변경하면 메모리 소비가 다시 정상으로 돌아 왔습니다.

내 질문왜 그를 일어 났습니까인가? 그런 작은 이미지 (위의보다 두 배의 이상)와 같은 거대한 스파이크를 만들려면 응용 프로그램을 느리게 만들었고, 꽤 당황하게합니다.

아래 이미지는 흰색 영역이 투명한 영역입니다. 내 버튼 크기 : 15dp x 15dp

enter image description here

나는 내 질문왜 그렇게 않았다이다, 반복? 이미 문제를 해결 한 이후로 해결책이 아닙니다.

답변

1

이미지가 디코딩 될 때 훨씬 더 많은 메모리가 필요하기 때문에 디스크에있는 이미지가 7-8KB 밖에되지 않는다.

분명히 큰 투명한 영역을 PNG 파일로 효율적으로 인코딩 할 수 있으므로 이미지의 크기가 작습니다. 사실 크기는 (600 x 745)이므로 메모리에 약 600 MB (745 * 4) 바이트에 약간의 메타 정보 (약 2 메가 바이트)가 필요합니다. 4 배수는 알파 채널로 색상을 인코딩하는 데 필요한 바이트의 양을 나타냅니다. 안드로이드 비트 맵은 내부적으로 1 차원의 선형 배열로 표현되므로 비트 맵을 만들기 위해 크기가 600 * 745 = 447000 인 배열을 시스템이 할당해야한다고 상상할 수 있습니다.

그래서 단순한 이미지의 경우 메모리 소비가 너무 많습니다.

+0

나는 그것이 해상도와 관련이 있을지 모르는 직감이 있었다. 기본적으로 이미지의 ** 해상도가 너무 높아서 Bitmap에서 내부 저장소가 ** 그 효과를 가져 왔기 때문에이 스파이크가 발생했다고 나에게 말하고 있습니까? –

+0

@ KaushikNP, 기본적으로 그렇습니다. 그러나 안드로이드 나 비트 맵의 ​​결함과 같은 것이 아닙니다. 비트 맵이 메모리에서 표현되는 방식 일뿐입니다. 픽셀의 원시 배열입니다. 디스크 상에서는 효율적으로 코드화 된 구조로 표현되기 때문에 훨씬 적은 공간을 차지합니다. – Dimezis

+0

감사합니다 Dimezis. 실제로 두 이미지의 해상도에는 큰 차이가 있으므로 이것이 가장 가능성이 높습니다. 실수는 비트 맵을 고려하지 않고 크기를 확인하는 것입니다. –