1.面板的使用
2.读取图片并获取图片的二维数组
3.图片的传入及代码块的使用
4.如何快速得到图片
5.图片的一些特效实现
1.面板的使用
JFrame窗体
模版边框布局
每个方位只能加一个组件(面板)
-南北
宽度与窗体一致,不可设置
高度可以设置
-东西
高度不可设置,如果有南北组件,去掉南北组件的高度,剩下的就是东西组件的高度
宽度可以设置
-中
宽高都不可以设置,剩下多少是多少
面板的默认布局时流动布局
JPanel jpbtn=new JPanel();
JPanel jpimage=new JPanel();
//给按钮面板设置一个宽度
jpbtn.setPreferredSize(new Dimension(100,0));
//改面板背景颜色
jpbtn.setBackground(Color.WHITE);
jpimage.setBackground(Color.PINK);
//在窗体上添加面板
//将按钮面板设为边界布局
jf.add(jpbtn,BorderLayout.WEST);
jf.add(jpimage);
2.读取图片并获取图片的二维数组
public int[][] getimgArr(String imgpath) {
File file=new File(imgpath);
//接收图片的对象
BufferedImage bufimage=null;
try{
bufimage= ImageIO.read(file);}
catch (IOException e){
throw new RuntimeException(e);
}
// 获取图片对应的二维数组
int imgArr[][]=new int[bufimage.getWidth()][bufimage.getHeight()];
for(int q=0;q<imgArr.length;q++){
for(int w=0;w<imgArr[0].length;w++){
imgArr[q][w]=bufimage.getRGB(q,w);
}
}
return imgArr;
}
3.图片的传入及代码块的使用
程序一旦运行,代码块就执行
{String path1="picture/131665156357_.pic.jpg";
String path2="picture/141665156358_.pic.jpg";
imgArr1=imagetools.getimgArr(path1);
imgArr2=imagetools.getimgArr(path2);
}
4.如何快速得到图片
如果绘制原图,则初级绘制方法为一个像素块一个像素块画矩形
public void drawImage(int[][]imageArr, Graphics g){
for(int q=0;q<imageArr.length;q++){
for(int w=0;w<imageArr[q].length;w++){
int mix=imageArr[q][w];
Color color=new Color(mix);
g.setColor(color);
g.fillRect(x+q,y+w,1,1);}}}
如果可以先先获取每一个像素块对应的数组,最后一次性画出,那么图片获取速度就会变快
public void drawImage(Graphics g,int[][]imgArr){
//创建一个bufferedimage对象
BufferedImage buffing=new BufferedImage(imgArr.length,imgArr[0].length,BufferedImage.TYPE_INT_ARGB);
for(int a=0;a<imgArr.length;a++){
for(int b=0;b<imgArr[0].length;b++){
int img=imgArr[a][b];
Color color=new Color(img);
//将像素值存入buffing中
buffing.setRGB(a,b,img);
// g.setColor(color);
// g.fillRect(X+a,Y+b,1,1);
}}
//循环结束后,将buffing绘制出来
g.drawImage(buffing,0,0,null);
}
5.图片的一些特效实现
灰度图
public void drawGrayImage(int[][]imageArr, Graphics g){
for(int q=0;q<imageArr.length;q++){
for(int w=0;w<imageArr[q].length;w++){
int mix=imageArr[q][w];
//拆rgb
//灰度图原理r=g=b
int red=(mix>>16)&255;
int green=(mix>>8)&255;
int blue=(mix>>0)&255;
Color color=new Color(red,red,red);
g.setColor(color);
g.fillRect(x+q,y+w,1,1);
}
}
}
二值化
public void drawBinaryImage(int[][]imageArr,Graphics g){
for(int q=0;q<imageArr.length;q++){
for(int w=0;w<imageArr[q].length;w++){
int mix=imageArr[q][w];
int red=(mix>>16)&255;
int green=(mix>>8)&255;
int blue=(mix>>0)&255;
//用green是否大于100做二分
if(green<100){
g.setColor(Color.BLUE);
}
else{g.setColor(Color.WHITE);}
g.fillRect(x+q,y+w,1,1);
}
}
}
马赛克
public void drawMosaicImage(int[][]imageArr,Graphics g){
for(int q=0;q<imageArr.length;q+=10){
for(int w=0;w<imageArr[q].length;w+=10){
//采样间距由1变为10
int mix=imageArr[q][w];
Color color=new Color(mix);
g.setColor(color);
g.fillRect(x+q,y+w,10,10);
//改采样间距的时候记得改小矩形的宽高
}
}
}
图片融合
注意三元运算符的使用
public void drawmixImage(Graphics g,int[][] imageArr,int[][] imageArr2){
//需要比较两张图片的宽高
//三元运算符
int w=imageArr.length<imageArr2.length?imageArr.length:imageArr2.length;
int h=imageArr[0].length<imageArr2[0].length?imageArr[0].length:imageArr2[0].length;
//取小的宽和高
for(int a=0;a<w;a++){
for(int b=0;b<h;b++){
int mix1=imageArr[a][b];
int red1=(mix1>>16)&255;
int green1=(mix1>>8)&255;
int blue1=(mix1>>0)&255;
int mix2=imageArr2[a][b];
int red2=(mix2>>16)&255;
int green2=(mix2>>8)&255;
int blue2=(mix2>>0)&255;
//均值法
int red=(red1+red2)/2;
int green=(green1+green2)/2;
int blue=(blue1+blue2)/2;
Color color=new Color(red,green,blue);
g.setColor(color);
g.fillRect(X+a,Y+b,1,1);
}
}}