Java--图形像素原理
图形像素原理
每张图片都可以表示为由像素值组成的矩阵。
分辨率决定单位面积的像素个数
像素矩阵:像素点的值 – 颜色表达
RGB图像又称为真彩图像,它使用R、G、B 3个分量标识一个像素的颜色,R、G、B分别代表红、绿、蓝3种不同的基础颜色,通过3基色可以合成出任意颜色。所以对一个尺寸nxm的彩色图像来说,MATLAB中则存储为一个nxmx3 的多维数据数组,其中数组中的元素定义了图像中每一个像素的红、绿、蓝颜色值。图形文件格式把RGB图像存储为24位的图像,红、绿、蓝分量分别占用8位,因而理论上可以有2^24种颜色。
R G B:
0-255 256个 8bit 256 256 256
像素值的存储
1.创建一个二维数组来表示像素组成的矩阵
把三个byte 存入一个int
RGB
0000 0000 32位
1000 0000 24位 R
1000 0000 16位 G
1000 0000 低八位 B
0表示黑色 255 表示白色
Java的位移运算
为什么二进制1000等于-8
也就是说,对于4位整数1000,最高位为1符号位,说明是一个负数。那么它的计算方式是:
- -1 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0=-8+0+0+0=-8
再例如二进制的1111,按照这个计算方式结果是:
- -1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0=-8+4+2+1=-1
Java中的int类型占32位,因此能表示的范围为-2^31 ~ 2^31-1,
int类型的十进制范围表示为:-2147483648~2147483647
int类型的二进制表示范围为: 10000000 00000000 00000000 00000000 ~ 01111111 11111111 11111111 11111111
左移<<
二进制数向左移动k位,丢弃最高的k位,并在有右边补k个0
01111111 11111111 11111111 11111111左移一位,符号位变成1,低位用0填充
所以结果位11111111 11111111 11111111 11111110,通过补码编码得出结果为-2
10000000 00000000 00000000 00000000左移一位,符号位变为0,代表正数,低位同样用0填充,结果位00000000 00000000 00000000 00000000,因此结果为0
右移>>
算术右移到方式比较微妙,二进制右移动k位,丢弃低k位,并在高k位补最高位的值。其目的是为了负数的运算
如下:算术右移动后,高位原本是几就用几补充
- 01111111 11111111 11111111 11111111 算术右移1位
- 00111111 11111111 11111111 11111111
- 10000000 00000000 00000000 00000000 算术右移1位
- 11000000 00000000 00000000 00000000
可以看到十进制无论是正还是负数,逻辑右移一位相当于除以二。
首先我们要都知道, &表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化.
我们只关心二进制的机器数而不关注十进制的值,那么byte &0xff只是对其最低8位的复制,通常配合逻辑或 ‘’|’'使用,达到字节的拼接
int vaule = ((255 & 0XFF) << 24) | ((red & 0XFF) << 16) | ((green & 0XFF) << 8) | ((blue & 0XFF) << 0);
此时代码终于看懂了
改进分析
package Image;import jdk.management.resource.internal.inst.FileOutputStreamRMHooks;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;/*** 1: 讲清楚图形像素原理* 2: 位移运算 以及位运算* 3: 完成像素图 - 基础效果 尝试比如调色板实现*/
public class ImagePad extends JFrame {public static int[][] res;public static int width;public static int height;public ImagePad() {setTitle("像素画");setSize(100 + width, height);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);setVisible(true);}@Overridepublic void paint(Graphics g) {super.paint(g);//ranDom(g);draWing(g);}public static void ranDom(Graphics g) {Color color = new Color(255, 255, 255);g.setColor(color);g.fillRect(100, 100, 500, 500);Random random = new Random();random.nextInt(256);// [0 bound)// 随机一个数组的像素值int[][] cloloArr = new int[500][500];for (int i = 0; i < 500; i++) {for (int j = 0; j < 500; j++) {int red = random.nextInt(256);int green = random.nextInt(256);int blue = random.nextInt(256);int vaule = ((255 & 0XFF) << 24) | ((red & 0XFF) << 16) | ((green & 0XFF) << 8) | ((blue & 0XFF) << 0);cloloArr[i][j] = vaule;}}for (int i = 0; i < 500; i++) {for (int j = 0; j < 500; j++) {Color color1 = new Color(cloloArr[i][j]);g.setColor(color1);g.fillRect(100 + i, 100 + j, 1, 1);}}for (int i = 0; i < 500; i++) {for (int j = 0; j < 500; j++) {int value = cloloArr[i][j];int red = (value >> 16) & 0xFF;int green = (value >> 8) & 0xFF;int blue = (value >> 0) & 0xFF;int gray = (red + green + blue) / 5;Color color1 = new Color(red / 2, green / 2, blue / 2);g.setColor(color1);g.fillRect(610 + i, 100 + j, 1, 1);}}}public static void draWing(Graphics gr) {File file = new File("D:\\壁纸\\1.jpg");BufferedImage bi = null;try {bi = ImageIO.read(file);} catch (IOException e) {e.printStackTrace();}width = bi.getWidth();height = bi.getHeight();res = new int[width][height];int minx = bi.getMinX();int miny = bi.getMinY();for (int i = minx; i < width; i++) {for (int j = miny; j < height; j++) {int pixel = bi.getRGB(i, j);res[i][j] = pixel;}}for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {int value = res[i][j];int red = (value >> 16) & 0xFF;int green = (value >> 8) & 0xFF;int blue = (value >> 0) & 0xFF;int gray=(red+green+blue)/3;Color color1 = new Color(red/3,green/3,blue);Color color2 = new Color(gray,gray,gray);gr.setColor(color1);//gr.setColor(color2);gr.fillRect(minx + i, miny + j, 1, 1);}}}public static void main(String[] args) {new ImagePad();}
}
分析
int value = res[i][j];int red = (value >> 16) & 0xFF;int green = (value >> 8) & 0xFF;int blue = (value >> 0) & 0xFF;int gray=(red+green+blue)/3;Color color1 = newColor(red/3,green/3,blue);Color color2 = new Color(gray,gray,gray);
原图:
当new Color(red/2,green/2,blue/2)
效果如下:
当new Color(red/3,green/3,blue/3)
效果如下:
当int gray=(red+green+blue)/3;
效果如下:
当int gray=(red+green+blue)/6;
效果如下:
Java--图形像素原理相关推荐
- Java图形开发--GUI
Java图形开发--GUI 1.图形用户界面(gui)介绍 图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作. awt, ...
- Java课设对对碰_第11章对对碰游戏(图形版)(Java游戏编程原理与实践教程课件).ppt...
游戏界面和相关图片素材 11.3 程序设计的步骤 11.3.1 设计游戏窗口类(GameRoom.java) 游戏窗口类GameRoom实现游戏全部功能,继承JFrame组件实现的.是由上方Panel ...
- Java图形界面编程
一.Java图形用户界面(gui)介绍 1.Java GUI简介 图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加 ...
- java 图形界面设计,使用JPanel、JFrame 绘图,图形界面设计入门演示,各种主要绘图方法以及图片、文字插入
那什么是JPanel?JFrame 又是什么呢?让我们先来了解一下他们的区别吧: JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel ...
- java图形界面重写坐标_重写自由软件和计算机图形的历史
java图形界面重写坐标 您还记得上世纪90年代初大多数屏幕保护程序都显示飞扬的3D金属徽标的日子吗? 你有一个吗? 在本文中,我想回顾一下过去,并简要回顾计算机图形学(CG)从研究实验室过渡到每个人 ...
- java 图形界面
1.创建一个窗口框架 /*** java 用户界面框架* 2016/5/10*/ package org.windows;import javax.swing.*; public class MyJF ...
- Java图形界面开发利器WindowBuilder
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- Java图形程序设计(一)
在正式探讨 Java 图形程序之前,我们先来厘清两个概念,并阐述它们之间的区别: AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面 ...
- java图形界面外部类例题_[JAVA_开课吧资源]第四周 图形用户界面程序设计
主题一 图形用户界面程序设计 » 图形用户界面概述 Java语言提供了大量支持GUI设计的类,如按钮.菜单.列表.特性框.对话框等组件类,同时也提供了包含窗口.面板等容器类.Java的抽象工具集AWT ...
最新文章
- Java内存模型终于能讲明白啦,建议收藏!
- 4.Azure创建点到站点的***隧道(下)
- 优秀logo设计解析_必修课 | 抛开固有思维,品牌amp;logo设计不求人!
- 转:在csv中维护变量参数
- C++奥赛一本通贪心题解
- RSync实现文件备份同步,rsync服务器
- docker学习系列:设置阿里云容器加速器
- 天网防火网的安装与使用
- 微信小程序错误码:“errcode“:40163和微信小程序-pad block corrupted 问题
- VS LNK2001--链接器工具错误
- 插入参考文献时,本该显示为[1],但显示了{Zhao,2017,#253},解决方法
- c语言 圆周率10000位,圆周率(小数点后10000位,背死你)
- MSSQL 注入鄙见
- PowerPoint2007无法将Excel图表转换为图形对象
- su: 无法设置组: 不允许的操作
- 微盛·企微管家杨明:未来企业微信生态能诞生中国的Salesforce
- C/C++实现矩阵各种运算
- POJ 2431 丛林探险(优先队列)
- python输入abcd输出对应的1234_python学习日记——练习题整理及解答
- C语言程序设计教程 北京邮电,C语言程序设计教程(第3版)/ 杨路明 9787563543403 北京邮电...