图形像素原理

每张图片都可以表示为由像素值组成的矩阵。

分辨率决定单位面积的像素个数

像素矩阵:像素点的值 – 颜色表达

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--图形像素原理相关推荐

  1. Java图形开发--GUI

    Java图形开发--GUI 1.图形用户界面(gui)介绍 图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作. awt, ...

  2. Java课设对对碰_第11章对对碰游戏(图形版)(Java游戏编程原理与实践教程课件).ppt...

    游戏界面和相关图片素材 11.3 程序设计的步骤 11.3.1 设计游戏窗口类(GameRoom.java) 游戏窗口类GameRoom实现游戏全部功能,继承JFrame组件实现的.是由上方Panel ...

  3. Java图形界面编程

    一.Java图形用户界面(gui)介绍 1.Java GUI简介   图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加 ...

  4. java 图形界面设计,使用JPanel、JFrame 绘图,图形界面设计入门演示,各种主要绘图方法以及图片、文字插入

    那什么是JPanel?JFrame 又是什么呢?让我们先来了解一下他们的区别吧: JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel ...

  5. java图形界面重写坐标_重写自由软件和计算机图形的历史

    java图形界面重写坐标 您还记得上世纪90年代初大多数屏幕保护程序都显示飞扬的3D金属徽标的日子吗? 你有一个吗? 在本文中,我想回顾一下过去,并简要回顾计算机图形学(CG)从研究实验室过渡到每个人 ...

  6. java 图形界面

    1.创建一个窗口框架 /*** java 用户界面框架* 2016/5/10*/ package org.windows;import javax.swing.*; public class MyJF ...

  7. Java图形界面开发利器WindowBuilder

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  8. Java图形程序设计(一)

    在正式探讨 Java 图形程序之前,我们先来厘清两个概念,并阐述它们之间的区别: AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面 ...

  9. java图形界面外部类例题_[JAVA_开课吧资源]第四周 图形用户界面程序设计

    主题一 图形用户界面程序设计 » 图形用户界面概述 Java语言提供了大量支持GUI设计的类,如按钮.菜单.列表.特性框.对话框等组件类,同时也提供了包含窗口.面板等容器类.Java的抽象工具集AWT ...

最新文章

  1. Java内存模型终于能讲明白啦,建议收藏!
  2. 4.Azure创建点到站点的***隧道(下)
  3. 优秀logo设计解析_必修课 | 抛开固有思维,品牌amp;logo设计不求人!
  4. 转:在csv中维护变量参数
  5. C++奥赛一本通贪心题解
  6. RSync实现文件备份同步,rsync服务器
  7. docker学习系列:设置阿里云容器加速器
  8. 天网防火网的安装与使用
  9. 微信小程序错误码:“errcode“:40163和微信小程序-pad block corrupted 问题
  10. VS LNK2001--链接器工具错误
  11. 插入参考文献时,本该显示为[1],但显示了{Zhao,2017,#253},解决方法
  12. c语言 圆周率10000位,圆周率(小数点后10000位,背死你)
  13. MSSQL 注入鄙见
  14. PowerPoint2007无法将Excel图表转换为图形对象
  15. su: 无法设置组: 不允许的操作
  16. 微盛·企微管家杨明:未来企业微信生态能诞生中国的Salesforce
  17. C/C++实现矩阵各种运算
  18. POJ 2431 丛林探险(优先队列)
  19. python输入abcd输出对应的1234_python学习日记——练习题整理及解答
  20. C语言程序设计教程 北京邮电,C语言程序设计教程(第3版)/ 杨路明 9787563543403 北京邮电...

热门文章

  1. 【PHP】创蓝253云通讯paas平台短信验证码接口调用emo
  2. 小白编程-资源帖-h5模板源码
  3. 【Kubernetes】 DaemonSet 详解
  4. vivo计算机背景,怎么修改VIVO手机浏览器中的主题与背景颜色
  5. (转载)WPS Excel中单元格内容改变自动变色
  6. 鼓励大学生创业的英文翻译,大学生创业计划书用英语怎么说
  7. 【惠普打印机有线连接实现扫描功能】
  8. 返回一个二维整数数组中的最大子数组的和
  9. 十行代码实现浏览器自动刷新
  10. Android JSONObject 转 String / String转JSONObject