📄 lineargreytrans.java
字号:
/**
* @(#)LinearGreyTrans.java
*
* LinearGreyTrans application
*
* @author :Caizhiming
* @version 1.00 2008/11/1
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class LinearGreyTrans extends Frame{
Image img,tmp;
int i,width,height;
int[] pixels;
boolean flag=false;
double a=1.1;
int b=30;
//LinearGreyTrans 的构造方法
public LinearGreyTrans()
{
Panel m_panel;
Button load,run,quit;
//添加窗口监听事件
addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
m_panel=new Panel();
m_panel.setBackground(Color.LIGHT_GRAY);
load=new Button("装载图像");
run=new Button("线性变换");
quit=new Button("退出");
this.add(m_panel,BorderLayout.SOUTH);
m_panel.add(load);
m_panel.add(run);
m_panel.add(quit);
// 以下三个函数为三个按钮的监听函数 注:监听到按钮事件发生后调用相应的处理函数。
load.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ Function_load_action(e); }
});
run.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ Function_run_action(e); }
});
quit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ Function_quit_action(e);}
});
} //LinearGreyTrans 的构造函数结束
//以下为三个按钮消息处理函数
public void Function_load_action(ActionEvent e)
{
//利用Media Tracker跟踪图像的加载
MediaTracker tracker=new MediaTracker(this);
img=Toolkit.getDefaultToolkit().getImage("Nature3.jpg");
tracker.addImage(img,0);
//等待图像完全加载
try{
tracker.waitForID(0);
}
catch(InterruptedException e1)
{
e1.printStackTrace();
}
//获取图像的高度height和宽度width
height=img.getWidth(this);
width=img.getHeight(this);
pixels=new int[width*height];
//把图像捕获到数组pixels中
try{
PixelGrabber pg=new PixelGrabber(img,0,0,width,height,pixels,0,width);
pg.grabPixels();
}
catch(InterruptedException e2)
{
e2.printStackTrace();
}
//获取图像的RGB值和Alpha值 ColorModel:0xAARRGGBB
ColorModel cm=ColorModel.getRGBdefault();
for(i=0;i<width*height;i++)
{
int alpha =cm.getAlpha(pixels[i]);
int red =cm.getRed(pixels[i]);
int green =cm.getGreen(pixels[i]);
int blue =cm.getBlue(pixels[i]);
pixels[i] =alpha<<24 | red<<16 |green<<8|blue;
}
//将数组中的象素产生一个图像
ImageProducer ip=new MemoryImageSource(width,height,pixels,0,width);
tmp=createImage(ip);
flag=true;
repaint();
}
public void Function_run_action(ActionEvent e)
{
//把图像捕获到数组pixels中
try{
PixelGrabber pg=new PixelGrabber(img,0,0,width,height,pixels,0,width);
pg.grabPixels();
}
catch(InterruptedException e1)
{
e1.printStackTrace();
}
//对图像进行线性拉伸,Alpha值保持不变
ColorModel cm=ColorModel.getRGBdefault();
for(i=0;i<width*height;i++)
{
int alpha =cm.getAlpha(pixels[i]);
int red =cm.getRed(pixels[i]);
int green =cm.getGreen(pixels[i]);
int blue =cm.getBlue(pixels[i]);
//增加图像的亮度
red=(int)(red*a+b);
green=(int)(green*a+b);
blue=(int)(blue*a+b);
//判断是否超过255
if(red>=255){red=255;}
if(green>=255){green=255;}
if(blue>=255){blue=255;}
pixels[i] =alpha<<24 | red<<16 |green<<8|blue;
}
//将数组中的象素产生一个图像
ImageProducer ip=new MemoryImageSource(width,height,pixels,0,width);
tmp=createImage(ip);
flag=true;
repaint();
}
public void Function_quit_action(ActionEvent e)
{ System.exit(0); }
//调用paint()方法,显示图像
public void paint(Graphics g)
{
if(flag)
{ g.drawImage(tmp,20,20,this); }
else{}
}
//定义main方法,设置窗口的大小,显示窗口
public static void main(String[] args)
{
// TODO, add your application code
LinearGreyTrans LGT=new LinearGreyTrans();
LGT.setSize(300,300);
LGT.show();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -