zoukankan      html  css  js  c++  java
  • Android raw to bmp

    Android raw 格式转 bmp 图像

    raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示。其中:

       8位RAW: 四位RGBA 来表示一位灰度;

      24位RAW: 三位RGB相同,A(alpha)用0XFF表示。

    Bitmap.Config 枚举说明:

      位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。

    • ALPHA_8        代表8位Alpha位图
    • ARGB_4444    代表16位ARGB位图
    • ARGB_8888    代表32位ARGB位图
    • RGB_565        代表8位RGB位图

    实现如下

     3 import java.io.ByteArrayOutputStream;
      4 import java.io.IOException;
      5 import java.io.InputStream;
      6 import java.nio.ByteBuffer;
      7 
      8 import android.graphics.Bitmap;
      9 
     10 /**
     11  * Raw转Bitmap
     12  * 
     13  * @author ChenRui
     14  * 
     15  */
     16 public class RawToBitMap
     17 {
     18     /**
     19      * 从流中读取数组
     20      * 
     21      * @param stream
     22      *            输入流
     23      * @return
     24      */
     25     public static byte[] readByteArrayFormStream(InputStream stream)
     26     {
     27         try
     28         {
     29             ByteArrayOutputStream outStream = new ByteArrayOutputStream();
     30             int len = 0;
     31             byte[] tmp = new byte[1024];
     32             while ((len = stream.read(tmp)) != -1)
     33             {
     34                 outStream.write(tmp, 0, len);
     35             }
     36             
     37             byte[] data = outStream.toByteArray();
     38             
     39             return data;
     40         }
     41         catch (IOException e)
     42         {
     43             e.printStackTrace();
     44             return new byte[0];
     45         }
     46     }
     47     
     48     /**
     49      * 8位灰度转Bitmap
     50      * 
     51      * 图像宽度必须能被4整除
     52      * 
     53      * @param data
     54      *            裸数据
     55      * @param width
     56      *            图像宽度
     57      * @param height
     58      *            图像高度
     59      * @return
     60      */
     61     public static Bitmap convert8bit(byte[] data, int width, int height)
     62     {
     63         byte[] Bits = new byte[data.length * 4]; //RGBA 数组
     64         
     65         int i;
     66         for (i = 0; i < data.length; i++)
     67         {
     68             // 原理:4个字节表示一个灰度,则RGB  = 灰度值,最后一个Alpha = 0xff;
     69             Bits[i * 4] = Bits[i * 4 + 1] = Bits[i * 4 + 2] = data[i];
     70             Bits[i * 4 + 3] = -1; //0xff
     71         }
     72         
     73         // Bitmap.Config.ARGB_8888 表示:图像模式为8位
     74         Bitmap bmp = Bitmap
     75                 .createBitmap(width, height, Bitmap.Config.ARGB_8888);
     76         bmp.copyPixelsFromBuffer(ByteBuffer.wrap(Bits));
     77         
     78         return bmp;
     79     }
     80     
     81     /**
     82      * 24位灰度转Bitmap
     83      * 
     84      * 图像宽度必须能被4整除
     85      * 
     86      * @param data
     87      *            裸数据
     88      * @param width
     89      *            图像宽度
     90      * @param height
     91      *            图像高度
     92      * @return
     93      */
     94     public static Bitmap convert24bit(byte[] data, int width, int height)
     95     {
     96         byte[] Bits = new byte[data.length * 4]; //RGBA 数组
     97         
     98         int i;
     99         
    100         // data.length / 3 表示 3位为一组
    101         for (i = 0; i < data.length / 3; i++)
    102         {
    103             // 原理:24位是有彩色的,所以要复制3位,最后一位Alpha = 0xff;
    104             Bits[i * 4] = data[i * 3];
    105             Bits[i * 4 + 1] = data[i * 3 + 1];
    106             Bits[i * 4 + 2] = data[i * 3 + 2];
    107             Bits[i * 4 + 3] = -1;
    108         }
    109         
    110         // Bitmap.Config.ARGB_8888 表示:图像模式为8位
    111         Bitmap bmp = Bitmap
    112                 .createBitmap(width, height, Bitmap.Config.ARGB_8888);
    113         bmp.copyPixelsFromBuffer(ByteBuffer.wrap(Bits));
    114         
    115         return bmp;
    116     }
    117     
    118     /**
    119      * 8位灰度转Bitmap
    120      * 
    121      * @param stream
    122      *            输入流
    123      * @param width
    124      *            图像宽度
    125      * @param height
    126      *            图像高度
    127      * @return
    128      */
    129     public static Bitmap convert8bit(InputStream stream, int width, int height)
    130     {
    131         return convert8bit(readByteArrayFormStream(stream), width, height);
    132     }
    133     
    134     /**
    135      * 24位灰度转Bitmap
    136      * 
    137      * @param data
    138      *            输入流
    139      * @param width
    140      *            图像宽度
    141      * @param height
    142      *            图像高度
    143      * @return
    144      */
    145     public static Bitmap convert24bit(InputStream stream, int width, int height)
    146     {
    147         return convert24bit(readByteArrayFormStream(stream), width, height);
    148     }
    149 }

     显示时宽度和高度必须匹配正确。

    ImageView1.setImageBitmap(RawToBitMap.convert8bit(getAssets().open("8bit.raw"), 512, 512));
  • 相关阅读:
    图片压缩后,依然很大的解决方案
    怎么使用javascript实现类的功能
    javascript实现像java、c#之类的sleep暂停的函数功能
    用ajax和asp.net实现智能搜索功能
    insert into 和insert into select性能比较
    百度编辑器
    document.selection.createRange()
    CSS设置透明效果
    class中一个小技巧
    asp.net中 解析JSON
  • 原文地址:https://www.cnblogs.com/chenrui7/p/4561020.html
Copyright © 2011-2022 走看看