Как я могу преобразовать байтовый массив из BGR24 в JPG в JAVA? - PullRequest
2 голосов
/ 31 марта 2020

В этот раз я попробовал следующее решение. Таким образом, изображение зеркально отражается, а операции слишком сложны в вычислительном отношении. Мне нужно выполнить операции примерно за 40 мс.

int[] shifted = new int[CAPTURE_WIDTH * CAPTURE_HEIGHT];

// (byte) bgra to rgb (int)
for (int i = 0, j = 0; i < pbFrame.length; i = i + 4, j++) {
int b, g, r;

b = pbFrame[i] & 0xFF;
g = pbFrame[i + 1] & 0xFF;
r = pbFrame[i + 2] & 0xFF;

shifted[j] = (r << 16) | (g << 8) | b;
}

BufferedImage bufferedImage = new BufferedImage(CAPTURE_WIDTH, CAPTURE_HEIGHT, BufferedImage.TYPE_INT_RGB);
bufferedImage.getRaster().setDataElements(0, 0, CAPTURE_WIDTH, CAPTURE_HEIGHT, pbFrame);

String path = "C:\\Users\\Administrator\\Desktop\\images" +
String.format("%03d", n) + ".jpg";
File outputfile = new File(path); //create new outputfile object
ImageIO.write(bufferedImage, "JPG", outputfile);
n++

В C# работает следующий код:

Bitmap bitmap = new Bitmap(cx, cy, cx*3, PixelFormat.Format24bppRgb, pbFrame);
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
bitmap.Save("./test.jpeg", myImageCodecInfo, null);

ImageCodecInfo GetEncoderInfo(String mimeType)
{
    int j
    ImageCodecInfo[] encoders
    encoders = ImageCodecInfo.GetImageEncoders();
    for (j = 0; j < encoders.Length; ++j)
    {
      if (encoders[j].MimeType == mimeType)
        return encoders[j];
    }
    return null;
}
...