16

有没有办法旋转字节数组而不将其解码为位图?

目前在 jpeg PictureCallback 中,我只是将字节数组直接写入文件。但是图片是旋转的。我想在不解码为位图的情况下旋转它们,希望这样可以节省我的记忆。

    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeByteArray(data, 0, data.length, o);

    int orientation;
    if (o.outHeight < o.outWidth) {
        orientation = 90;
    } else {
        orientation = 0;
    }

    File photo = new File(tmp, "demo.jpeg");

    FileOutputStream fos;
    BufferedOutputStream bos = null;
    try {
        fos = new FileOutputStream(photo);
        bos = new BufferedOutputStream(fos);
        bos.write(data);
        bos.flush();
    } catch (IOException e) {
        Log.e(TAG, "Failed to save photo", e);
    } finally {
        IOUtils.closeQuietly(bos);
    }
4

4 回答 4

5

尝试这个。它将解决目的。

Bitmap storedBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, null);

Matrix mat = new Matrix();                        
mat.postRotate("angle");  // angle is the desired angle you wish to rotate            
storedBitmap = Bitmap.createBitmap(storedBitmap, 0, 0, storedBitmap.getWidth(), storedBitmap.getHeight(), mat, true);
于 2013-08-22T17:00:21.643 回答
3

您可以通过 Exif 标头设置 JPEG 旋转,而无需对其进行解码。这是最有效的方法,但某些观看者可能仍会显示旋转的图像。

或者,您可以使用JPEG 无损旋转不幸的是,我不知道这个算法的免费 Java 实现。

在 SourceForge 上更新,有一个 Java 开源类LLJTran。Android 端口位于GitHub 上

于 2013-05-20T17:46:21.290 回答
2

I don't think that there is such possibility. Bytes order depends from picture encoding (png, jpeg). So you are forced to decode image to do something with it.

于 2013-05-20T14:44:54.660 回答
0

像这样试试

private byte[] rotateImage(byte[] data, int angle) {
    Log.d("labot_log_info","CameraActivity: Inside rotateImage");
    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, null);
    Matrix mat = new Matrix();
    mat.postRotate(angle);
    bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    return stream.toByteArray();
}

您可以rotateImage通过提供从onPictureTaken方法获取的图像数据和旋转角度来调用。

例如:rotateImage(data, 90);

于 2021-09-15T16:20:53.883 回答