目录
前言
代码实现
整体思路
步骤和代码
效果
注意事项
paint()方法
关于nextInt()
Color类的使用
发散思考
前言
上篇文章,我主要介绍了在java中对于图片中的像素点的数据运算——移位,本文将在之前的基础上,介绍如何具体使用java语言来编写马赛克效果。马赛克是一种将图片分割成小块,每个小块都是一个颜色块,最终形成一种整体的效果。
代码实现
整体思路
java常用于开发桌面应用程序和web应用程序,其中Swing是java是常用的图形用户界面GUI工具包,Swing提供了许多可以重用的UI组件,我们要借助Swing来将我们的马赛克效果呈现出来。
步骤和代码
- 创建一个类,取名为Mos,并选择继承JFrame类,来作为主窗口
- 在类中创建paint()方法,用于设计绘制马赛克的代码
- 使用Graphics对象用于绘制。确定好我们是要绘制一个矩形,把矩形分成很多小方块并为每个小方块分配颜色。
- 创建一个二维数组来表示每个小方块的颜色值。采用Random类的random方法来随机生成颜色值。
- 最好把这些小方块绘制到窗口中,通过使用Graphics对象的fillRect()方法来绘制1*1的矩形,最终将得到一个完整的马赛克图片。
package com.image;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class Mos extends JFrame {
@Override
public void paint(Graphics g){
super.paint(g);
//绘制蓝色背景和图片大小
g.setColor(Color.BLUE);
g.fillRect(0,0,255,255);
//设置图像的高度和宽度,即在出现在窗体中的什么方位
int w=255;
int h=255;
int[][] pixels=new int[w][h];//存储像素颜色值的矩阵
Random random=new Random();
//创建像素矩阵,便于后续直接调用矩阵里面的数据,循环语句采取遍历的方式
for(int i=1;i<pixels.length;i++){
for(int j=1;j<pixels[i].length;j++){
//对于透明度,我们采取遍历的方式,而对于RGB,我们用随机数的方式获取数值
int a=j;
int red=random.nextInt(i);
int green=random.nextInt(i);
int blue=random.nextInt(i);
int pixel=a<<24|red<<16<<green<<8|blue;//将四个颜色值合成一个像素颜色值
pixels[i][j]=pixel;//把像素颜色值存储到矩阵中
}
}
//将矩阵绘制成图片
for(int i=0;i<pixels.length;i++){
for(int j=0;j<pixels[i].length;j++){
int num=pixels[i][j];
int a=(num>>>24);
int red=(num>>16)&0xFF;
int green=(num>>8)&0xFF;
int blue=num&0xFF;
Color color=new Color(red,green,blue,a);//根据颜色值合成一个像素颜色值
g.setColor(color);//设置绘图颜色
g.fillRect(100+i,100+j,1,1);//绘制小矩形
}
}
for(int i=0;i<pixels.length;i++){
for(int j=0;j<pixels[j].length;j++){
int num=pixels[i][j];
int a=(num>>>24);
int red=(num>>16)&0xFF;
int green=(num>>8)&0xFF;
int blue=num&0xFF;
Color color=new Color(red,green,blue,a);
g.setColor(color);
g.fillRect(350+i,100+j,1,1);
}
}
}
public static void main(String[] args){
Mos mos=new Mos();
mos.setTitle("马赛克");
mos.setSize(900,900);
mos.setVisible(true);
}
}
效果
注意事项
paint()方法
其实这里的paint()方法本质上是重写,因为我们是继承了JFrame类
关于nextInt()
nextInt()是Random类的一个方法,返回的是一个伪随机、均匀分布的int值,这个值是介于0(包括)和指定值(不包括)之间的一个数字。这样我们就做到了随机生成颜色数值。
Color类的使用
Color类是java标准库中的一个类,位于java.awt包中。所以我们可以直接使用,不需要进行显式的声明
发散思考
- 通过随机生成的颜色值可能会导致图片颜色不够平滑,其实我们可以使用更加严谨的算法来生成像素颜色值。
- Swing时功能强于,并且易于使用的界面库,不过当我们要处理大规模的图像或者实现更加复杂的图像处理算法时,是否可以考虑使用其他图像处理库或者框架,比如openCV。