dev/graphics/fb0 或者dev/fb0 文件中存储的数据是什么样子的数据?是不是二进制

时间:2021-09-09 11:16:09
各位高手们,本程序猿写了一程序是从如标题两个文件中读取图像数据,但是用c读取出数据之后返回到java层的数据发现不能正常的转换成bitmap,看来是得到的数据有问题。请问一下高手们,从以上两个文件读取出的数据是不是二进制的数据,还是是别的类型的数据。。求指点。dev/graphics/fb0 或者dev/fb0 里边取出的到底是什么数据。。

15 个解决方案

#1


数据是raw数据,里面存储的数据格式和你要转换的格式不一样,我是转成ARGB_8888格式的,贴上我处理的代码

获取屏幕大小:
DisplayMetrics metrics =new DisplayMetrics();
WindowManager WM = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
Display display = WM.getDefaultDisplay();
display.getMetrics(metrics);
int height = metrics.heightPixels; //屏幕高
int width = metrics.widthPixels;    //屏幕的宽

// 获取显示方式
int pixelformat = display.getPixelFormat();
PixelFormat localPixelFormat1 =new PixelFormat();
PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat1);
int deepth = localPixelFormat1.bytesPerPixel;//位深

InputStream stream =getInputStream();
byte[] piex = new byte[height * width * deepth];
DataInputStream dStream = new DataInputStream(stream);
int i=0;
while(dStream.read(piex, 0, height * width * deepth) != -1){
// 保存图片
int[] colors = new int[height * width];   
for(int m=0;m<piex.length;m++){
if(m%4 == 0){
int r = (piex[m] & 0xFF);
int g = (piex[m+1] & 0xFF);
int b = (piex[m+2] & 0xFF);
int a = (piex[m+3] & 0xFF);
colors[m/4]= (a << 24) + (r <<16) + (g <<8) + b;
}
}
// piex生成bitmap
Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);

// bitmap保存为png格式:
FileOutputStream out = new FileOutputStream("/mnt/sdcard/test"+x+".png");
bitmap.compress(Bitmap.CompressFormat.PNG, 100,out);

#2


嗯嗯。。好的,我试试。谢谢啦。。不好意思,好长时间没回复,最近在忙别的。。呵呵。。

#3


引用 2 楼 jizhuni_weixiao 的回复:
嗯嗯。。好的,我试试。谢谢啦。。不好意思,好长时间没回复,最近在忙别的。。呵呵。。

楼主实现了吗,我用得到的是黑屏的,求指导

#4


我得到的也是黑屏。。。。

#5


colors[m/4]= (a << 24) + (r <<16) + (g <<8) + b; 
要是黑屏的话,自己试试换换每个值的位置,或者可以用纯的red等颜色来测试 哪个位置存的是r值

#6


为什么我获取的图片,很乱,而且是一部分、一部分的,不能获取整个屏幕的

#7


跪谢楼主啊。。!

#8


楼主,为什么我获取的图片,很乱,而且是一部分、一部分的,不能获取整个屏幕的

#9


求完整linux 下截屏代码(

#10


要的是 c 语言的代码

#11


现在其他手机可以,为什么三星的p3100 fb0取不到数据

#12


黑屏是因为你们没有root权限,搜root相关的资料。

#13


楼主正解,非常感谢。 dev/graphics/fb0 或者dev/fb0 文件中存储的数据是什么样子的数据?是不是二进制

#14


我的获取了root权限也是黑屏,同样的代码小米1可以小米三就不可以了,极度困惑中

#15


黑屏的原因我怀疑是像素格式的参数没输入正确造成的

#1


数据是raw数据,里面存储的数据格式和你要转换的格式不一样,我是转成ARGB_8888格式的,贴上我处理的代码

获取屏幕大小:
DisplayMetrics metrics =new DisplayMetrics();
WindowManager WM = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
Display display = WM.getDefaultDisplay();
display.getMetrics(metrics);
int height = metrics.heightPixels; //屏幕高
int width = metrics.widthPixels;    //屏幕的宽

// 获取显示方式
int pixelformat = display.getPixelFormat();
PixelFormat localPixelFormat1 =new PixelFormat();
PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat1);
int deepth = localPixelFormat1.bytesPerPixel;//位深

InputStream stream =getInputStream();
byte[] piex = new byte[height * width * deepth];
DataInputStream dStream = new DataInputStream(stream);
int i=0;
while(dStream.read(piex, 0, height * width * deepth) != -1){
// 保存图片
int[] colors = new int[height * width];   
for(int m=0;m<piex.length;m++){
if(m%4 == 0){
int r = (piex[m] & 0xFF);
int g = (piex[m+1] & 0xFF);
int b = (piex[m+2] & 0xFF);
int a = (piex[m+3] & 0xFF);
colors[m/4]= (a << 24) + (r <<16) + (g <<8) + b;
}
}
// piex生成bitmap
Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);

// bitmap保存为png格式:
FileOutputStream out = new FileOutputStream("/mnt/sdcard/test"+x+".png");
bitmap.compress(Bitmap.CompressFormat.PNG, 100,out);

#2


嗯嗯。。好的,我试试。谢谢啦。。不好意思,好长时间没回复,最近在忙别的。。呵呵。。

#3


引用 2 楼 jizhuni_weixiao 的回复:
嗯嗯。。好的,我试试。谢谢啦。。不好意思,好长时间没回复,最近在忙别的。。呵呵。。

楼主实现了吗,我用得到的是黑屏的,求指导

#4


我得到的也是黑屏。。。。

#5


colors[m/4]= (a << 24) + (r <<16) + (g <<8) + b; 
要是黑屏的话,自己试试换换每个值的位置,或者可以用纯的red等颜色来测试 哪个位置存的是r值

#6


为什么我获取的图片,很乱,而且是一部分、一部分的,不能获取整个屏幕的

#7


跪谢楼主啊。。!

#8


楼主,为什么我获取的图片,很乱,而且是一部分、一部分的,不能获取整个屏幕的

#9


求完整linux 下截屏代码(

#10


要的是 c 语言的代码

#11


现在其他手机可以,为什么三星的p3100 fb0取不到数据

#12


黑屏是因为你们没有root权限,搜root相关的资料。

#13


楼主正解,非常感谢。 dev/graphics/fb0 或者dev/fb0 文件中存储的数据是什么样子的数据?是不是二进制

#14


我的获取了root权限也是黑屏,同样的代码小米1可以小米三就不可以了,极度困惑中

#15


黑屏的原因我怀疑是像素格式的参数没输入正确造成的