Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位图的字节数组返回null_Java_Android_Bitmap_Android Bitmap_Bitmapfactory - Fatal编程技术网

Java 位图的字节数组返回null

Java 位图的字节数组返回null,java,android,bitmap,android-bitmap,bitmapfactory,Java,Android,Bitmap,Android Bitmap,Bitmapfactory,我有一个小程序,它将Chair.jpg转换为位图。这样做的原因是将像素的颜色类型更改为BGR_888的格式(我从中获得) 但是,位图为空。我相信是因为这个原因,D/skia:---无法创建带有消息“未实现”的图像解码器。。从网上看,可能是因为我需要压缩这个?我不确定。有人能帮我理解吗 public类MainActivity扩展了AppCompatActivity{ 文本视图文本视图; 图像视图图像视图; @凌驾 创建时受保护的void(Bundle savedInstanceState){ su

我有一个小程序,它将Chair.jpg转换为位图。这样做的原因是将像素的颜色类型更改为BGR_888的格式(我从中获得)

但是,位图为空。我相信是因为这个原因,
D/skia:---无法创建带有消息“未实现”的图像解码器。
。从网上看,可能是因为我需要压缩这个?我不确定。有人能帮我理解吗

public类MainActivity扩展了AppCompatActivity{
文本视图文本视图;
图像视图图像视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=findViewById(R.id.imageView);
textView=findViewById(R.id.textView);
位图b=BitmapFactory.decodeResource(getResources(),R.drawable.chair);
设置图像位图(b);
int width=b.getWidth();
int height=b.getHeight();
Log.d(“位图高度”,String.valueOf(高度));
Log.d(“位图宽度”,String.valueOf(宽度));
Bitmap.Config=b.getConfig();
Log.d(“b颜色格式”,String.valueOf(config));
字节[]newImage=getImagePixels(b);
Log.d(“getImagePixels结果”,String.valueOf(newImage));
布尔b2=isNewBitmapNull(newImage);
Log.d(“是我的新位图null:”,String.valueOf(b2));
}
/// 
///函数getImagePixels
///目的:给定位图图像,返回已转换的4字节ARGB到3字节BGR
/// 
///位图图像对象
公共字节[]getImagePixels(位图图像){
//计算图像由多少字节组成
int bytes=image.getByteCount();
//创建一个新的缓冲区
ByteBuffer缓冲区=ByteBuffer.allocate(字节);
//将字节数据移动到缓冲区
copyPixelsToBuffer(缓冲区);
//获取包含数据的基础数组。
字节[]temp=buffer.array();
//分配3字节BGR
字节[]像素=新字节[(临时长度/4)*3];
//将像素复制到位
对于(int i=0;i<(temp.length/4);i++){
像素[i*3]=temp[i*4+3];//B
像素[i*3+1]=temp[i*4+2];//G
像素[i*3+2]=temp[i*4+1];//R
//阿尔法被丢弃
}
Log.d(“检查是否为数组”,String.valueOf(pixels.getClass().isArray());
Log.d(“数组对象类型”,String.valueOf(pixels.getClass());
Log.d(“数组长度”,String.valueOf(pixels.length));
返回像素;
}
公共静态字节[]convertBitmapToByteArrayUncompressed(位图){
ByteBuffer ByteBuffer=ByteBuffer.allocate(bitmap.getByteCount());
copyPixelsToBuffer(byteBuffer);
byteBuffer.rewind();
返回byteBuffer.array();
}
/// 
///函数copyPixelsToBitmap
///用途:给定像素数据,返回大小为[?,?]的位图,PixelFormat=24BGR
/// 
///带像素数据的字节数组
公共位图copyPixelsToBitmap(字节[]像素){
//在这里创建位图以了解高度、宽度和格式
位图bmp=BitmapFactory.decodeByteArray(像素,0,像素.长度);
//返回位图
返回bmp;
}
/// 
///函数isNewBitmapNull
///目的:给定像素数据返回T/F,创建位图
/// 
///带像素数据的字节数组
公共布尔值isNewBitmapNull(字节[]像素){
//BitmapFactory.Options=new-BitmapFactory.Options();
//options.inMutable=true;
位图bmp=BitmapFactory.decodeByteArray(像素,0,像素.长度);
如果(bmp==null)
返回true;
返回false;
}
}
对于isNewBitMapNull方法,我还尝试添加BitMapFactory选项,但仍然得到一个空位图:

//BitmapFactory.Options=new BitmapFactory.Options();
//options.inMutable=true;
位图bmp=BitmapFactory.decodeByteArray(像素,0,像素.长度,选项);
以下是输出:

D/位图高度:1260
D/位图宽度:1260
D/b颜色格式:ARGB_8888
D/检查是否为数组:true
D/数组对象类型:类[B]
D/阵列长度:4762800
D/getImagePixels结果:[B@5a36e09
D/skia:---无法创建带有消息“未实现”的图像解码器
D/我的新位图是否为null::true

似乎您正在尝试创建一个每像素3字节的位图,但在Android中不可能,因为位图支持

这就是为什么需要使用受支持的像素格式创建新位图的原因。但使用不起作用,因为它使用压缩图像数据(例如存储在.jpg文件中的数据)创建位图。但您有原始像素值数组(未压缩)

压缩图像,然后使用
decodeByteArray
读取图像是一个选项,您需要自己或使用第三方库来实现
BGR_888
压缩。更简单的方法是将
BGR_888
转换回
ARGB_888
,并从此数据创建位图:

val temp=IntArray(宽*高)
用于(i在0中,直到宽度*高度){
val red=像素[i*3+2].toInt()和0xff
val green=像素[i*3+1].toInt()和0xff
val blue=像素[i*3].toInt()和0xff
温度[i]=颜色rgb(红色、绿色、蓝色)
}
返回Bitmap.createBitmap(温度、宽度、高度、Bitmap.Config.ARGB_8888)

Java版本:

int[] temp = new int[width * height];

for (int i = 0; i < width * height; ++i) {
    int red = (int)pixels[i * 3 + 2] & 0xff;
    int green = (int)pixels[i * 3 + 1] & 0xff;
    int blue = (int)pixels[i * 3] & 0xff;
    temp[i] = Color.rgb(red, green, blue);
}
return Bitmap.createBitmap(temp, width, height, Bitmap.Config.ARGB_8888);
int[]temp=newint[width*height];
对于(int i=0;i
Y