gpt4 book ai didi

java - Android下Bitmap.setPixels扭曲颜色

转载 作者:行者123 更新时间:2023-12-02 06:34:44 28 4
gpt4 key购买 nike

<小时/>

我需要从手机摄像头获取图像。我使用公式将 YUV 转换为 RGB。然后我将 RGB 放入 IntBuffer 中。然后我将像素从 IntBuffer 复制到 Bitmap 中。这种方式给出了正确的结果。但我需要使用的不是 IntBuffer,而是一个常见的 int[] 数组。在这种情况下,函数 bitmap.setPixels 会产生不正确的结果。颜色不对。第一张图片是正确的。第二个图像是 int[] 的结果。

安卓4.1.1HTC Desire X

enter image description here enter image description here

    @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++;
}
}
}

最佳答案

这是我遇到类似问题时用来交换红色和蓝色 channel 的简单代码

for (int i = 0; i < totalPixels; ++i) {
// The alpha and green channels' positions are preserved while the red and blue are swapped
pixelsBuffer[i] = ((pixelsBuffer[i] & 0xff00ff00)) | ((pixelsBuffer[i] & 0x000000ff) << 16) | ((pixelsBuffer[i] & 0x00ff0000) >> 16);
}

关于java - Android下Bitmap.setPixels扭曲颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772558/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com