错误记录二:byte[] 转图片时失败的问题

2019-10-28  本文已影响0人  简秋默

在一次使用相机获取图片并保存图片的过程中,byte[] 转图片/图片文件一直不成功,也不报错,折磨了我好一会,不明白为什么这样。后来借鉴网上的思路,对byte[] 进行转码处理,然后再转为图片/图片文件。自己试了一下,确实可以解决问题,虽然原因还是不明确,但也记录一下,以供以后学习参考。

byte[]转为图片文件时的原代码:

private void bytesToImageFile(byte[] data, String path) {

        try {

            File file = new File(path);

            if(file.exists()){

                file.delete();

                file.createNewFile();

            }

            FileOutputStream fos = new FileOutputStream(file);

            fos.write(data, 0, data.length);

            fos.flush();

            fos.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

}

此段代码运行后能创建图片文件,但图片文件为损坏的文件,无法使用。

byte[]转为Bitmap时的原代码:


private static Bitmap byteToBitmap(byte[] data){

        return BitmapFactory.decodeByteArray(data, 0, data.length);

}

此段代码运行后返回null。

转码处理,方法如下:


/**

* 转码处理

* @param data

* @param width 图片宽度

* @param height 图片高度

* @return

*/

private static byte[] transcodeProcess(byte[] data, int width, int height){

        YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, width, height, null);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        yuvImage.compressToJpeg(new Rect(0, 0, width, height), 80, baos);

        byte[] jdata = baos.toByteArray();

        return jdata;

}

在上面byte转图片文件和Bitmap的过程中,加入转码处理,即可达到预期目的。

byte转图片文件:


private void bytesToImageFile(byte[] data, String path) {

        try {

            File file = new File(path);

            if(file.exists()){

                file.delete();

                file.createNewFile();

            }

            // 转码处理

            byte[] jdata = transcodeProcess(data, 100, 100);

            FileOutputStream fos = new FileOutputStream(file);

            fos.write(data, 0, data.length);

            fos.flush();

            fos.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

}

byte转Bitmap:


private static Bitmap byteToBitmap(byte[] data){

        // 转码处理

        byte[] jdata = transcodeProcess(data, 100, 100);

        return BitmapFactory.decodeByteArray(jdata , 0, jdata.length);

}

上一篇下一篇

猜你喜欢

热点阅读