2011-11-10 5 views
1

이 코드 조각의 문제점을 알려주시겠습니까? 안드로이드 비트 맵 조작

//bmp is a bitmap of already present image 
int width=bmp.getWidth(); 
int height=bmp.getHeight(); 
int rgbval[]=new int[width*height]; 
bmp.getPixels(rgbval, 0, width, 0, 0, width, height); 
rgbval=actual(rgbval); 
Bitmap bmp2=bmp.copy(Bitmap.Config.ARGB_8888,true); 
bmp2.setPixels(rgbval, 0, width, 0, 0, width, height); 

actual

내가 BMP의 RGB 값을 조작하기 위해 생성 한 함수이다. 일식의 디버그 기능을 사용하여 올바르게 작동하는지 확인했지만 bmp2의 rgb 값을 복구하려고 시도 할 때 조작 된 값을 얻지 못했습니다. 모든

답변

1

입니다. 나는 비트 맵의 ​​픽셀을 조작했고 정확히 같은 픽셀 값이 필요했지만 setPixels를 사용하여 비트 맵의 ​​전체 픽셀을 설정하면 작동하지 않았다. 사용하여 솔루션을 찾았습니다

index=0; 
for (int j = 0; j < height; j++) 
    for (int i = 0; i < width; i++) 
    { 
    destBitmap.setPixel(i, j, pixelvalues[index]); 

    } 

그래서 한 번에 하나씩 픽셀을 설정하면 어떻게 든 작동합니다!

2

첫째,이 답변 참조 : 그래서 Android Bitmap setPixel doens't work correctly? (set value, then read a different value)

를, 당신의 원본 이미지에 알파 채널 (즉, hasAlpha()가 false를 반환)이없는 경우, 자동에 RGB 값을 변환 할 것으로 보인다 미리 곱셈 된 형식 그게 당신이 겪고있는 것입니까? bmp.hasAlpha()가 false입니까?

코드에서 hasAlpha()가 true를 반환하는 비트 맵으로 기본 Android 아이콘을 사용하여 코드를 테스트했습니다. 입력 및 출력 색상 배열의 알파 채널은 동일합니다. 그러나 빨간색 채널은 2304 개 픽셀 중 15 개에서 하나 또는 두 개 씩 꺼져 있습니다. 파란색 또는 녹색 채널을 확인하지 않았습니다. 내부 반올림 오류라고 가정합니다. 나는 누군가가 추가 할 다른 것을 가지고있는 경우에 대비하여 다소 장황하고 사용하기 쉬운 테스팅 코드를 게시하고있다. 여기

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 

int width=bmp.getWidth(); 
int height=bmp.getHeight(); 
int rgbval[]=new int[width*height]; 
bmp.getPixels(rgbval, 0, width, 0, 0, width, height); 
int rgbval2[] = actual(rgbval); 

Bitmap bmp2=bmp.copy(Bitmap.Config.ARGB_8888,true); 
bmp2.setPixels(rgbval2, 0, width, 0, 0, width, height); 

int rgb2[] = new int[width*height]; 
bmp2.getPixels(rgb2, 0, width, 0, 0, width, height); 

int alpha1[] = new int[width*height]; 
int alpha2[] = new int[width*height]; 
int red1[] = new int[width*height]; 
int red2[] = new int[width*height]; 

for(int i=0; i<alpha2.length; ++i) { 
    alpha1[i] = Color.alpha(rgbval2[i]); 
    alpha2[i] = Color.alpha(rgb2[i]); 
    red1[i] = Color.red(rgbval2[i]); 
    red2[i] = Color.red(rgb2[i]); 

    if(red1[i]!=red2[i]) { 
     int a1 = alpha1[i]; 
     int a2 = alpha2[i]; 
     int r1 = red1[i]; 
     int r2 = red2[i]; 


     Log.e("E", String.format("a1: %d, a2: %d, r1: %d, r2: %d", a1, a2, r1, r2)); 
    } 
} 


private int[] actual(int rgb[]) { 
    int rgb2[] = new int[rgb.length]; 

    for(int i=0; i<rgb.length; ++i) { 
     rgb2[i] = Color.argb(Color.alpha(rgb[i]), Color.red(rgb[i])/2, 
         Color.green(rgb[i])/2, Color.blue(rgb[i])/2); 
    } 

    return rgb2; 
} 

내가 문제는 일부 안드로이드 버그로 인해 생각하는 로그 캣 출력

a1: 64, a2: 64, r1: 30, r2: 32 
a1: 64, a2: 64, r1: 30, r2: 32 
a1: 142, a2: 142, r1: 58, r2: 57 
a1: 142, a2: 142, r1: 58, r2: 57 
a1: 216, a2: 216, r1: 56, r2: 55 
a1: 216, a2: 216, r1: 56, r2: 55 
a1: 57, a2: 57, r1: 6, r2: 4 
a1: 59, a2: 59, r1: 6, r2: 4 
a1: 231, a2: 231, r1: 90, r2: 91 
a1: 216, a2: 216, r1: 95, r2: 94 
a1: 216, a2: 216, r1: 95, r2: 94 
a1: 217, a2: 217, r1: 57, r2: 58 
a1: 216, a2: 216, r1: 88, r2: 89 
a1: 199, a2: 199, r1: 66, r2: 67 
a1: 199, a2: 199, r1: 39, r2: 38 
+0

답장을 보내 주셔서 감사합니다. 내 비트 맵을 검사했는데 hasAlpha()가 false로 밝혀졌습니다. 어떻게 든 주위에 일할 수있는 방법을 제안 할 수 있습니다. 즉, hasAlpha()를 false로 사용하는 비트 맵에서도 작동하는 코드입니다. –

+1

내 게시물에있는 링크에서 bmp.setHasAlpha (true); 하지만 그 기능은 API 수준 12 이후에만 사용할 수 있습니다. 쉬운 대안은 hasAlpha()가 false 인 경우 읽은 픽셀의 알파 값을 255로 수동 설정하는 것입니다. –

+0

API 수준 7 또는 8에서 사용할 수 있도록 setHasAlpha()를 사용할 수 없도록 프로젝트를 디자인하려고합니다. 255로 알파 값을 자동으로 설정하는 것도 효과가없는 것 같습니다. 다른 해결 방법이 있습니까 –