我需要從手機的相機中獲取圖像。我使用公式將YUV轉換爲RGB。然後我把RGB放入IntBuffer。然後我將IntBuffer中的像素複製到位圖中。這樣可以給出正確的結果。 但我需要使用不是一個IntBuffer,而是一個普通的int []數組。在這種情況下,函數bitmap.setPixels產生不正確的結果。顏色是錯誤的。 第一張圖片是正確的。第二個圖像是int []的結果。Bitmap.setPixels在Android下扭曲顏色
的Android 4.1.1 的HTC Desire X
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Size previewSize = parameters.getPreviewSize();
int imageWidth = previewSize.width;
int imageHeight = previewSize.height;
if(toggleButton1.isChecked())
{
if(ck==0)
{
Bitmap preview_bitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
Bitmap preview_bitmap2 = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
final byte alpha = (byte) 255;
int numPixels = imageWidth*imageHeight;
IntBuffer intBuffer = IntBuffer.allocate(imageWidth*imageHeight);
intBuffer.position(0);
int buff[]= new int[imageWidth*imageHeight];
int i=0;
for (int y = 0; y < imageHeight; y++) {
for (int x = 0; x < imageWidth; x++) {
int Y = data[y*imageWidth + x] & 0xff;
int xby2 = x/2;
int yby2 = y/2;
float U = (float)(data[numPixels + 2*xby2 + yby2*imageWidth] & 0xff) - 128.0f;
float V = (float)(data[numPixels + 2*xby2 + 1 + yby2*imageWidth] & 0xff) - 128.0f;
// Do the YUV -> RGB conversion
float Yf = 1.164f*((float)Y) - 16.0f;
int R = (int)(Yf + 1.596f*V);
int G = (int)(Yf - 0.813f*V - 0.391f*U);
int B = (int)(Yf + 2.018f*U);
R = R < 0 ? 0 : R > 255 ? 255 : R;
G = G < 0 ? 0 : G > 255 ? 255 : G;
B = B < 0 ? 0 : B > 255 ? 255 : B;
intBuffer.put(alpha*16777216 + R*65536 + G*256 + B);
buff[i]= (alpha*16777216 + R*65536 + G*256 + B);
i++;
}
}
intBuffer.flip();
preview_bitmap.copyPixelsFromBuffer(intBuffer);
preview_bitmap2.setPixels(buff,0,imageWidth,0,0,imageWidth,imageHeight);
//imageView1.setImageBitmap(preview_bitmap);
//imageView2.setImageBitmap(preview_bitmap2);
save_SDcard(preview_bitmap,"pic1.jpg");
save_SDcard(preview_bitmap2,"pic2.jpg");
ck++;
}
}
}