Java下RAW转Bitmap

/**
 * Raw转Bitmap
 *
 * @author ChenRui
 */
public class RawToBitMap {
    /**
     * 从流中读取数组
     *
     * @param stream 输入流
     * @return
     */
    public static byte[] readByteArrayFormStream(InputStream stream) {
        try {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            int len = 0;
            byte[] tmp = new byte[1024];
            while ((len = stream.read(tmp)) != -1) {
                outStream.write(tmp, 0, len);
            }

            byte[] data = outStream.toByteArray();

            return data;
        } catch (IOException e) {
            e.printStackTrace();
            return new byte[0];
        }
    }

    /**
     * 8位灰度转Bitmap
     * <p>
     * 图像宽度必须能被4整除
     *
     * @param data   裸数据
     * @param width  图像宽度
     * @param height 图像高度
     * @return
     */
    public static Bitmap convert8bit(byte[] data, int width, int height) {
        byte[] Bits = new byte[data.length * 4]; //RGBA 数组

        int i;
        for (i = 0; i < data.length; i++) {
            // 原理:4个字节表示一个灰度,则RGB  = 灰度值,最后一个Alpha = 0xff;
            Bits[i * 4] = Bits[i * 4 + 1] = Bits[i * 4 + 2] = data[i];
            Bits[i * 4 + 3] = -1; //0xff
        }

        // Bitmap.Config.ARGB_8888 表示:图像模式为8位
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bmp.copyPixelsFromBuffer(ByteBuffer.wrap(Bits));

        return bmp;
    }

    /**
     * 24位灰度转Bitmap
     * <p>
     * 图像宽度必须能被4整除
     *
     * @param data   裸数据
     * @param width  图像宽度
     * @param height 图像高度
     * @return
     */
    public static Bitmap convert24bit(byte[] data, int width, int height) {
        byte[] Bits = new byte[data.length * 4]; //RGBA 数组

        int i;

        // data.length / 3 表示 3位为一组
        for (i = 0; i < data.length / 3; i++) {
            // 原理:24位是有彩色的,所以要复制3位,最后一位Alpha = 0xff;
            Bits[i * 4] = data[i * 3];
            Bits[i * 4 + 1] = data[i * 3 + 1];
            Bits[i * 4 + 2] = data[i * 3 + 2];
            Bits[i * 4 + 3] = -1;
        }

        // Bitmap.Config.ARGB_8888 表示:图像模式为8位
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bmp.copyPixelsFromBuffer(ByteBuffer.wrap(Bits));

        return bmp;
    }

    /**
     * 8位灰度转Bitmap
     *
     * @param stream 输入流
     * @param width  图像宽度
     * @param height 图像高度
     * @return
     */
    public static Bitmap convert8bit(InputStream stream, int width, int height) {
        return convert8bit(readByteArrayFormStream(stream), width, height);
    }

    /**
     * 24位灰度转Bitmap
     * <p>
     * 输入流
     *
     * @param width  图像宽度
     * @param height 图像高度
     * @return
     */
    public static Bitmap convert24bit(InputStream stream, int width, int height) {
        return convert24bit(readByteArrayFormStream(stream), width, height);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Android 中,可以使用 `BitmapFactory` 类中的 `decodeStream()` 方法来将 raw 资源文件换为 `Bitmap` 对象。 例如,如果你要将名为 `my_image` 的 raw 资源文件换为 `Bitmap` 对象,可以使用以下代码: ``` InputStream inputStream = getResources().openRawResource(R.raw.my_image); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); ``` 注意:在上述代码中,`getResources()` 方法返回当前上下文中的 `Resources` 对象,`openRawResource()` 方法用于打开 raw 资源文件并返回一个 `InputStream` 对象,然后将这个 `InputStream` 对象传递给 `decodeStream()` 方法,它将返回一个 `Bitmap` 对象。 需要注意的是,使用 `decodeStream()` 方法raw 资源文件时,你可能需要手动关闭 `InputStream` 对象,以释放系统资源。 ``` try { InputStream inputStream = getResources().openRawResource(R.raw.my_image); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); } finally { inputStream.close(); } ``` ### 回答2: Android中的raw文件夹是用于存放各种资源文件的文件夹之一。而将raw文件换为bitmap需要经过以下几个步骤: 首先,我们需要获取raw文件的路径。可以使用`Context`的`getResources()`方法,再调用`openRawResource()`方法,将对应的资源ID作为参数传入,此时会返回一个`InputStream`对象。 接下来,我们可以使用`BitmapFactory`的`decodeStream()`方法,将刚才获取到的`InputStream`对象换为`Bitmap`对象。此时需要传入一个`InputStream`参数,这里即为刚才获取到的`InputStream`对象。 最后,我们可以将得到的`Bitmap`对象用于需求中的任何操作,例如显示在`ImageView`中。 下面是代码示例: ```java // 获取raw文件的路径 InputStream inputStream = getResources().openRawResource(R.raw.my_raw_file); // 将InputStream换为Bitmap Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 将Bitmap对象显示在ImageView中 ImageView imageView = findViewById(R.id.my_image_view); imageView.setImageBitmap(bitmap); ``` 以上就是将Android的raw文件换为bitmap的简单步骤。 ### 回答3: 在Android中,将raw资源文件换为Bitmap的过程相对简单。首先,我们需要获取raw资源的文件描述符,然后利用BitmapFactory类的decodeStream方法将文件描述符换为Bitmap对象。 以下是具体的代码示例: ``` InputStream inputStream = getResources().openRawResource(R.raw.image); // 获取raw资源的输入流 Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 将输入流换为Bitmap对象 ``` 在上述代码中,我们首先使用getResources().openRawResource(R.raw.image)方法获取raw资源的输入流。假设我们的资源文件名为image,所以将R.raw.image作为参数传入该方法中。 接着,我们使用BitmapFactory.decodeStream(inputStream)方法将输入流换为Bitmap对象。最终,我们就得到了从raw资源中获取到的Bitmap对象。 需要注意的是,这段代码需要在Android的UI线程中执行,以避免阻塞UI界面。 另外,如果你想确定Bitmap对象宽高的话,可以使用BitmapFactory.Options结构和inJustDecodeBounds属性来进行二次采样处理。具体做法是首先使用inJustDecodeBounds属性为true来解码一次,获取到Bitmap的宽高信息,然后根据需要的宽高再次使用inJustDecodeBounds属性为false来解码正常的Bitmap。这样可以有效减少内存的使用。 希望以上回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值