java图像处理,画几个抽象派图片,一个简单的调色板可还行

图像处理

画马赛克之前先来点知识储备

图像原理:

像素 :是由图像的小方格组成的,每一个小方块都有一个明显的位置和被分配的色彩数值,小方格的颜色和位置就决定该图像所呈现出来的样子(以上来自科普中国)。
分辨率:每英寸上的像素数量,单位时DPI。像素相同时,分辨率越高,则像素密度越大,实际打印的尺寸越小,图像也就越清晰。
RGB颜色模型:是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以合成产生各种色彩光,共有256256256种颜色。
灰度图像:指r,g,b三个分量都相同,一般取平均值进行处理。
像素矩阵:对于一幅图像,可以把它看成一个二维数组(图像=[i][j]),对于每一个int值,就是这个点的像素值。
所以,图像处理的本质其实就是对代表图像的二维数组中的值进行处理

像素值的存储

我们知道,其实计算机都是用二进制数处理数据的,int类型有32位,byte是8位,每种原色的数量正好是一个8位,所以我们把像素值存储在一个int类型的数据中。
0000 0000 24~32位
0000 0000 16~24位,用来存储red的值
0000 0000 8~16位 ,用来存储green的值
0000 0000 0~8位,用来存储blue的值
那具体怎么存取呢?这里要用到移位操作符和位运算操作符:

移位操作符

左移 << (低位补0);右移 >>(符号位不变)

位运算操作符

&:位与,“相同保留,不同为1”;
|:位或,“只有都为0时才为0”;

取数据

将二进制数据移动相应的位数,然后只取第八位的数值就可以了。如何做到只取低八位的数呢?
对0xFF(低八位全为1的数)进行位与运算。

int red=(rgb >> 16) & 0xFF;//取红色
int green=(rgb >> 8) & 0xFF;//取绿色
int blue=(rgb >> 0) & 0xFF;//取蓝色

存数据

int rgb=  ((225 & 0xFF<< 24 | //不透明
           (red & 0xFF) << 16 | 
           (green & 0xFF)<< 8 | 
           (blue & 0xFF) << 0);

接下来我们就画一个马赛克吧!

package Paint0924;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
//继承JFrame
public class Paint extends JFrame{
	public static void main(String[] args) {
		Paint p=new Paint();
		p.UI();
	}
	public void UI() {
	//创建一个简单的界面
		this.setTitle("mosaic");
		this.setSize(700,500);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		this.setVisible(true);
	}
	
	public void paint(Graphics g) {
		super.paint(g);
		System.out.println("开始画图");
		
		//创建一个二维数组来保存数据
		int color[][]=new int[700][500];
		//存储数据
		//随机数
		Random ra=new Random();
		for(int i=0;i<700;i+=25) {
			for(int j=0;j<500;j+=25) {
				int red=ra.nextInt(256);//范围是区间[0,256)
				int green=ra.nextInt(256);
				int blue=ra.nextInt(256);
				int value=((255 & 0xFF)<<24 | 
						   (red & 0xFF)<<16 |
						   (green & 0xFF)<<8 |
						   (blue & 0xFF)<<0);
				color[i][j]=value;
	
						}
		}
		
		//灰度处理   马赛克
		//遍历数组
		for(int i=0;i<700;i+=25) {
			for(int j=0;j<500;j+=25) {
				int value=color[i][j];
				int red=(value>>16) & 0xFF;
				int green=(value>>8) & 0xFF;
				int blue=(value>>0) & 0xFF;
				//灰度处理,取平均数
				int gray=(red+green+blue)/3;
				System.out.println(gray);
				Color co2=new Color(gray,gray,gray);
				g.setColor(co2);
				g.fillRect(i, j, 25, 25);
			}
		}	
	}
}

程序运行效果如下:
在这里插入图片描述
另外,我们还可以画一些比较有意思的图片,比如,只要在遍历数组那儿稍微改动一下

for(int i=0;i<700;i+=2) {
			for(int j=0;j<500;j+=2) {
				Color co=new Color(color[i][j]);
				g.setColor(co);
				g.fillRect(i, j, 2, 2);
			}
		}

图片就会是:
在这里插入图片描述

我们来尝试一下做一个简单的调色板
代码及思路如下

public class Palette {
	public static void main(String[] args) {
		Palette p=new Palette();
		p.UI();
	}
	//创建一个内部类
	 class Colorchange implements ChangeListener,MouseListener{
		//重写所有方法
		    public void mousePressed(MouseEvent e) {
		        //用来获取整数值的
		    	int R=Integer.parseInt(red.getText());
				int G=Integer.parseInt(green.getText());
				int B=Integer.parseInt(blue.getText());
				//改变滑块内容
				s1.setValue(R);
				s2.setValue(G);
				s3.setValue(B);
		    }
		    public void stateChanged(ChangeEvent e) {
			 	int R=s1.getValue();
				int G=s2.getValue();
				int B=s3.getValue();
				j.setBackground(new Color(R,G,B));
			
		 }
		    public void mouseClicked(MouseEvent e) {}
		    public void mouseReleased(MouseEvent e) {}
		    public void mouseEntered(MouseEvent e) {}
		    public void mouseExited(MouseEvent e) {}	
	 }
		

	
	 		//创建面板
			JPanel jp1=new JPanel();
			
			//创建三个标签
			JLabel j1=new JLabel("R");
			JLabel j2=new JLabel("G");
			JLabel j3=new JLabel("B");
			
			//创建三个文字框记录rgb的值
			JTextField red=new JTextField();
			JTextField green=new JTextField();
			JTextField blue=new JTextField();
			
			//创建三个滑块
			JSlider s1=new JSlider();
			JSlider s2=new JSlider();
			JSlider s3=new JSlider();
			
			//创建窗体和按钮(用来显示颜色)
			JButton j=new JButton();
			JFrame jf=new JFrame();	
			
	public void UI() {
		jf.setTitle("color_palette");
		jf.setSize(700,500);
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(3);
		jf.setLayout(null);
		
		//给滑块设置最大值
		s1.setMaximum(255);
		s2.setMaximum(255);
		s3.setMaximum(255);

		//给滑块加上监听器
		Colorchange c=new Colorchange();
		s1.addChangeListener(c);
		s2.addChangeListener(c);
		s3.addChangeListener(c);

		//给rgb的值加上MouseListener监听器
				red.addMouseListener(c);
				green.addMouseListener(c);
				blue.addMouseListener(c);
				
		//把三个标签和三个滑块都添加到面板1上
		jp1.add(j1);
		jp1.add(s1);
		jp1.add(j2);
		jp1.add(s2);
		jp1.add(j3);
		jp1.add(s3);
		
		//设置按钮的位置和大小
		j.setBounds(0, 100, 700, 400);
		jp1.setBounds(0, 0, 700, 100);
		
		//把面板放到窗体上
		jf.add(jp1);
		jf.add(j);
		
		jf.setVisible(true);
	}		
}

程序运行结果如下:
在这里插入图片描述

界面有点丑哈~

如果对你有帮助,就点个赞吧~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个语言模型 AI,无法给您图。但我可以为您解释多态和抽象类。 多态:多态是面向对象编程中的一个重要概念,是指同一个方法可以根据对象的不同而具有不同的表现形式。在 Java 中,多态可以通过继承、接口实现和方法重写来实现。 抽象类:抽象类是一种不能被实例化的类,它的主要作用是为了被继承。抽象类可以包含抽象方法和非抽象方法,抽象方法必须被子类实现,非抽象方法可以被子类继承或重写。 下面是一个简单的示例代码,演示了多态和抽象类的使用: ```java abstract class Shape { public abstract void draw(); } class Circle extends Shape { public void draw() { System.out.println("一个圆形"); } } class Rectangle extends Shape { public void draw() { System.out.println("一个矩形"); } } public class Main { public static void main(String[] args) { Shape s1 = new Circle(); Shape s2 = new Rectangle(); s1.draw(); s2.draw(); } } ``` 输出结果为: ``` 一个圆形 一个矩形 ``` 在这个示例中,Shape 是一个抽象类,它包含一个抽象方法 draw()。Circle 和 Rectangle 都是 Shape 的子类,它们都实现了 draw() 方法。在 main() 方法中,我们分别创建了一个 Circle 和一个 Rectangle 对象,并将它们赋值给 Shape 类型的 s1 和 s2 变量。由于多态的特性,s1 和 s2 可以调用 draw() 方法,它们具有不同的表现形式。最终输出结果为一个圆形和一个矩形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值