Конвертировать RAW изображение в JPG в Java - PullRequest
0 голосов
/ 03 января 2019

У меня есть устройство захвата, которое возвращает RAW 640x480 BGR. Документы для его поддержки имеют только примеры кода .net / C #.

Вот пример кода, который они имеют в .net SDK

Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
                                                            bmp.Width,
                                                            bmp.Height),
                                              ImageLockMode.WriteOnly,
                                              bmp.PixelFormat);

Marshal.Copy(faceImage, 0, bmpData.Scan0, faceImage.Length);
bmp.UnlockBits(bmpData);

Вот самое близкое, что у меня есть в Java, но цвета все еще выключены

int nindex = 0;
int npad = (raw.length / nHeight) - nWidth * 3;

BufferedImage bufferedImage = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_4BYTE_ABGR);
DataBufferByte dataBufferByte = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer());
byte[][] bankData = dataBufferByte.getBankData();
byte brgb[] = new byte[(nWidth + npad) * 3 * nHeight];

System.arraycopy(raw, 0, brgb, 0, raw.length);

for(int j = 0; j < nHeight - 1; j++)
{
    for(int i = 0; i < nWidth; i++)
    {
        int base = (j * nWidth + i) * 4;
        bankData[0][base] = (byte) 255;
        bankData[0][base + 1] = brgb[nindex + 1];
        bankData[0][base + 2] = brgb[nindex + 2];
        bankData[0][base + 3] = brgb[nindex];
        nindex += 3;
    }
    nindex += npad;
}

ImageIO.write(bufferedImage, "png", bs);

Красный и зеленый цвета, кажется, перевернуты. Ценю ваш отзыв, чтобы исправить это. Спасибо!

1 Ответ

0 голосов
/ 03 января 2019

Следующая часть вашего кода мне не совсем подходит

bankData[0][base] = (byte) 255;
bankData[0][base + 1] = brgb[nindex + 1];
bankData[0][base + 2] = brgb[nindex + 2];
bankData[0][base + 3] = brgb[nindex];

Вы определяете свое буферизованное изображение с помощью TYPE_4BYTE_ABGR. Документы Java говорят

Байтовые данные чередуются в одном байтовом массиве в порядке A, B, G, R от младших до старших байтовых адресов в каждом пикселе.

По вашему мнению, формат необработанного изображения также должен быть BGR, следовательно, байты в вашем необработанном изображении должны иметь порядок B, G, R от младшего до старшего байта, верно? Насколько я могу судить из вашего фрагмента, вы копируете значение красного канала в зеленый канал, значение синего канала в красный канал и значение зеленого канала в синий канал. Копирование байтов должно быть скорее

bankData[0][base] = (byte) 255;
bankData[0][base + 1] = brgb[nindex]; // B
bankData[0][base + 2] = brgb[nindex + 1]; // G
bankData[0][base + 3] = brgb[nindex + 2]; // R
...