「java转灰阶」java代码转c
今天给各位分享java转灰阶的知识,其中也会对java代码转c进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、RGB与YUV
- 2、在java编程中java编译器会将java程序转换为
- 3、java 强制类型转换的规则是什么?
- 4、java 中如何获得灰度图像的像素值,getRGB和getRaster有什么区别?
- 5、Java中的强制类型转换是如何转换的?
RGB与YUV
每个像素用1个bit表示,可表示的颜色范围为双色,即最传统的黑和白。1个bit只能表示0,1两种值。需要调色板,不过调色板只包含两种颜色。
每个像素用4个bit表示,4个bit所能够表示的索引范围是0-15,共16个。也就是可以表示16种颜色。即调色板中包含16中颜色。
每个像素用8个bit表示。8个bit所能够表示的索引范围是0-255,共256个。也就是可以表示256中颜色。即调色板中包含256中颜色。
RGB像素格式中的bit存储的是每一个像素点的R,G,B值
一个像素用16个bit = 2个byte表示 ,R=5 G=6 B=5
为什么绿色为6位?
一个像素用16个bit = 2个byte,但是最高位不用,R=5 G=5 B=5
RGB24图像每个像素用8个bit,共24个位表示,共3个字节,注意:在内存中RGB各分量的排列顺序为:BGR
RGB32图像每个像素用32个bit表示,占4个byte,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留。注意:在内存中RGB各分量的排列顺序为:BGR
RGB32图像每个像素用32个bit表示,占4个字节,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个为透明像素。注意:在内存中RGB各分量的排列顺序为:BGRA
注意:java默认使用大端字节序,c/c++默认使用小端字节序,android平台下Bitmap.config.ARGB_8888的Bitmap默认是大端字节序,当需要把这个图片内存数据给小端语言使用的时候,就需要把大端字节序转换为小端字节序。例如:java层的ARGB_565传递给jni层使用时,需要把java层的ARGB_565的内存数据转换为BGRA565。
详细验证请看: Android Bitmap像素排列与JNI操作
YUV有很多变种,我们常说的YUV指的是YCbCr,YUV三个字母中,其中”Y”表示明亮度(Lumina nce或Luma),也就是灰阶值;而”U”和”V”表示的则是色度(Chrominance或Chroma)作用是描述影像色彩及饱和度,用于指定像素的颜色。Cb指蓝色色度分量,而Cr指红色色度分量,是标准 YUV 的一个翻版(还有YPbPr等),此文中,我们就用 YUV 指代 YCbCr 了。
首先,YUV按照数据大小分为三个格式,YUV420,YUV422,YUV444。由于人眼对Y的敏感度远超于对U和V的敏感,所以可以多个Y分量共用一组UV,这样既可以极大的节省空间,又可以不太损失质量。
按照多个 Y 分量共用一个 UV 的方式,我们可以把 YUV 分为 420,422,444 三种类型,而在这三种类型之下,我们又可以按照 YUV 的排列储存顺序,将其细分为好多种格式,这些格式数量繁多,又不好记忆,这为我们学习过程中造成了不少困难。下面我就为大家一一介绍。
首先,我们将可以按照 YUV 的排列方式,再次将 YUV 分成三个大类,Planar,Semi-Planar 和 Packed。
Planar YUV 三个分量分开存放
Semi-Planar Y 分量单独存放,UV 分量交错存放
Packed YUV 三个分量全部交错存放
按照这三种方式,我们就可以将 YUV 格式进行比较细致的分类了。
YUV的所有格式列表
一张从上到下分别为原图、Y、U 和 V:
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。
如下图所示:
其中,Y 分量用叉表示,UV 分量用圆圈表示。
举个例子 :
假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最后映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最后映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
可以看到这种采样方式的图像和 RGB 颜色模型的图像大小是一样,并没有达到节省带宽的目的,当将 RGB 图像转换为 YUV 图像时,也是先转换为 YUV 4:4:4 采样的图像。
YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。如果水平方向有 10 个像素点,那么采样了 10 个 Y 分量,而只采样了 5 个 UV 分量。
如下图所示:
举个例子 :
假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3] 那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。
最后映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3 其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。
最后映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
采样的码流映射为像素点,还是要满足每个像素点有 Y、U、V 三个分量。但是可以看到,第一和第二像素点公用了 U0、V1 分量,第三和第四个像素点公用了 U2、V3 分量,这样就节省了图像空间。
一张 1280 * 720 大小的图片,在 YUV 4:2:2 采样时的大小为:
可以看到 YUV 4:2:2 采样的图像比 RGB 模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。
如下图所示:
假设第一行扫描了 U 分量,第二行扫描了 V 分量,那么需要扫描两行才能够组成完整的 UV 分量。
举个例子 :
假设图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那么采样的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。
最后映射出的像素点为:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
假设图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那么采样的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。
最后映射出的像素点为:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
从映射出的像素点中可以看到,四个 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采样中两个 Y 分量共用一套 UV 分量,这样更能够节省空间。
一张 1280 * 720 大小的图片,在 YUV 4:2:0 采样时的大小为:
可以看到 YUV 4:2:0 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。
YUV 的存储格式,有两种:
YUYV 格式是采用打包格式进行存储的,指每个像素点都采用 Y 分量,但是每隔一个像素采样它的 UV 分量,排列顺序如下:
UYVY 格式也是采用打包格式进行存储,它的顺序和 YUYV 相反,先采用 U 分量再采样 Y 分量,排列顺序如下:
YUV 422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。
基于 YUV 4:2:0 采样的格式主要有 YUV 420P 和 YUV 420SP 两种类型,每个类型又对应其他具体格式。
I420 的单帧结构示意图如下(Planar 方式)
这幅图的上面一幅可以看出 Y1、Y2、Y7、Y8 共用 U1 和 V1。后面的线性数组为其存储顺序,可以看出 Y、U 和 V 都是顺序存储的,往外写的时候,先按顺序将 Y 分量写出,然后再根据 U、V 分别将它们依次写出即可。
NV12的单帧结构示意图如下(Planar 方式)
可以看出与 YV12 不同的时,它的 Y 虽然也是顺序存储,但 U、V 却是交错存储的,这种方式存储在往外写出时则先直接顺序写出 Y,然后对 UV 分别依次写出。
PS:Android的Camera Preview默认图像格式为NV21。
把RGB和YUV的范围都缩放到[0,255]
YUV转RGB
RGB转YUV
参考资料:
图片RGB数据格式
一文读懂 YUV 的采样与格式
视音频数据处理入门:RGB、YUV像素数据处理
Android Bitmap像素排列与JNI操作
YUV420_SVG
在java编程中java编译器会将java程序转换为
Java字节码。Java字节码是一种中间代码格式,类似于汇编代码,但不是针对任何具体的硬件平台,而是针对Java虚拟机(JVM)运行的。Java字节码可以在任何支持JVM的平台上运行,使得Java程序可以跨平台运行。
java 强制类型转换的规则是什么?
1、执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如:int型转换成double型,char型转换成int型等等;
2、赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;
3、函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参;
4、函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回。
扩展资料
C++中强制类型转换函数有4个:
1、const_cast(用于去除const属性)。
2、static_cast(用于基本类型的强制转换)。
3、dynamic_cast(用于多态类型之间的类型转换)。
4、reinterpreter_cast(用于不同类型之间的指针之间的转换,最常用的就是不同类型之间函数指针的转换)。
隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。
在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。
在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回。
参考资料
百度百科-强制类型转换
java 中如何获得灰度图像的像素值,getRGB和getRaster有什么区别?
关于图像像素值,我想要先讲一下Java中如何组织一个图像对象BufferedImage的,
一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等
信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首
先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p
newimageformatIO.jar即可。
取得BufferedImage的代码如下:
File file = new File("D:\\test\\blue_flower.jpg");
BufferedImage image = ImageIO.read(file);
取得像素使用getRGB,代码如下:
int type= image.getType();
if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );
else
return image.getRGB( x, y, width, height, pixels, 0, width );
写入像素,才可能用到getRaster,在type为ARGB 或RGB时,必须使用getRaster().setDataElements方式设置,其他格式直接setRGB,代码如下:
int type= image.getType();
if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
image.getRaster().setDataElements(x, y, width, height, pixels );
else
image.setRGB(x, y, width, height, pixels, 0, width );
Java中的强制类型转换是如何转换的?
java中数据类型的强制转换是通过强制转换语句完成的,强制转换语句的格式为“目标数据类型 变量=(目标数据类型)数据;”。下面给出例子:
1、定义两个字节数据类型a、b、c,分别赋予1和2和a+b的值,进行加法运算的式子a+b=3,得出的结果“3”将会被编译环境判定为整形数据,把这个整形数据赋值给c,系统将会报错,这样就需要用到格式为“目标数据类型 变量=(目标数据类型)数据;”的强制转换语句。
2、根据强制转换语句的格式,易得“bytec=(byte)(a+b);”;
3、这样就把整形数据的“3”赋值给字节数据类型的c了,其中完成数据的强制类型转换。
扩展资料:
基本类型转换原则:
1、类型转换主要在在 赋值、方法调用、算术运算 三种情况下发生。
a、赋值和方法调用转换规则:从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换:
(1)布尔型和其它基本数据类型之间不能相互转换;
(2)byte型可以转换为short、int、、long、float和double;
(3)short可转换为int、long、float和double;
(4)char可转换为int、long、float和double;
(5)int可转换为long、float和double;
(6)long可转换为float和double;
(7)float可转换为double;
b、算术运算中的类型转换:
1、基本就是先转换为高位数据类型,再参加运算,结果也是最高位的数据类型;
2、byteshortchar运算会转换为Int;
(1)如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。
(2)如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。
(3)如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。
(4)如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。
特殊:
(1)如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。
(2) 当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char类型不发生改变;
参考资料:百度百科-java关键字
java转灰阶的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码转c、java转灰阶的信息别忘了在本站进行查找喔。