首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请教多线程问题! [已结帖,结帖人:laihuahua]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laihuahua
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-07-07 22:46:23 楼主
    Java code
    //MultiMedianImage.java /* 程序说明:用多线程实现对图像的中值滤波调用MedianThread.java 作 者:lai */ import java.awt.*; import java.awt.image.*; import java.awt.event.*; import javax.swing.*; class MultiMedianImage extends Frame { Image im,tmp; int iw,ih; int[] pixels; boolean flag=false; //构造方法 public MultiMedianImage(){ super("中值滤波"); Panel pdown; Button load,run,save,quit; //添加窗口监听事件 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); pdown = new Panel(); pdown.setBackground(Color.lightGray); load=new Button("装载图像"); run = new Button("中值滤波"); save=new Button("保存"); quit=new Button("退出"); this.add(pdown,BorderLayout.SOUTH); pdown.add(load); pdown.add(run); pdown.add(save); pdown.add(quit); load.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ jLoad_ActionPerformed(e); } }); run.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ jRun_ActionPerformed(e); } }); quit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ jQuit_ActionPerformed(e); } }); save.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ jSave_ActionPerformed(e); } }); } public void jLoad_ActionPerformed(ActionEvent e){ //利用MediaTracker跟踪图像的加载 MediaTracker tracker = new MediaTracker(this); im=Toolkit.getDefaultToolkit().getImage("001.jpg"); tracker.addImage(im,0); //等待图像的完全加载 try{ tracker.waitForID(0); }catch(InterruptedException e2){ e2.printStackTrace();} //获取图像的宽度iw和高度ih iw=im.getWidth(this); ih=im.getHeight(this); pixels=new int[iw*ih]; try{ PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw); pg.grabPixels(); }catch (InterruptedException e3) { e3.printStackTrace(); } //将数组中的象素产生一个图像 ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw); tmp=createImage(ip); flag=true; repaint(); } public void jRun_ActionPerformed(ActionEvent e){ if(flag){ //调用MedianThread.java进行多线程中值滤波 MedianThread mt=new MedianThread(iw,ih,im,pixels); for(int i=1;i<ih;i++) { Thread thread=new Thread(mt); thread.start(); } pixels=mt.GetPixels(); //System.out.println(pixels.length); //将数组中的象素产生一个图像 ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw); tmp=createImage(ip); flag=true; repaint(); }else { JOptionPane.showMessageDialog(null,"请先打开一幅图片!", "Alert",JOptionPane.WARNING_MESSAGE); } } public void jSave_ActionPerformed(ActionEvent e){ //Save Image if(flag){ } else{ JOptionPane.showMessageDialog(null,"请先打开一幅图片!", "Alert",JOptionPane.WARNING_MESSAGE); } } public void jQuit_ActionPerformed(ActionEvent e){ //System.exit(0); JOptionPane op =new JOptionPane(); int exit=op.showConfirmDialog(this,"你要退出吗? ? ?","退出",JOptionPane.YES_NO_OPTION); if(exit==JOptionPane.YES_OPTION) { System.exit(0); }else{ } } //调用paint()方法,显示图像信息。 public void paint(Graphics g){ if(flag){ g.drawImage(tmp,10,20,this); }else { } } public static void main(String[] args) { MultiMedianImage mi = new MultiMedianImage(); mi.setLocation(50,50); mi.setSize(500,400); mi.setVisible(true); } } class MedianThread implements Runnable { int pixels[]; int iw,ih,i; Image im; public MedianThread(int iw,int ih,Image im,int[] pixels)//final int i { //this.i=i; this.iw=iw; this.ih=ih; this.im=im; this.pixels=pixels; } public void run() { try{ PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw); pg.grabPixels(); }catch (InterruptedException e3) { e3.printStackTrace(); } //对图像进行中值滤波,Alpha值保持不变 ColorModel cm=ColorModel.getRGBdefault(); //++i; synchronized(this) { if(i<ih) { for(int j=1;j<iw-1;j++) { int red,green,blue; int alpha=cm.getAlpha(pixels[i*iw+j]); //int red2=cm.getRed(pixels[(i-1)*iw+j]); int red4=cm.getRed(pixels[i*iw+j-1]); int red5=cm.getRed(pixels[i*iw+j]); int red6=cm.getRed(pixels[i*iw+j+1]); //int red8=cm.getRed(pixels[(i+1)*iw+j]); //水平方向进行中值滤波 if(red4>=red5){ if(red5>=red6) {red=red5;} else{ if(red4>=red6) {red=red6;} else{red=red4;} }} else{ if(red4>red6) {red=red4;} else{ if(red5>red6) {red=red6;} else{red=red5;} }} //int green2=cm.getGreen(pixels[(i-1)*iw+j]); int green4=cm.getGreen(pixels[i*iw+j-1]); int green5=cm.getGreen(pixels[i*iw+j]); int green6=cm.getGreen(pixels[i*iw+j+1]); //int green8=cm.getGreen(pixels[(i+1)*iw+j]); //水平方向进行中值滤波 if(green4>=green5){ if(green5>=green6) {green=green5;} else{ if(green4>=green6) {green=green6;} else{green=green4;} }} else{ if(green4>green6) {green=green4;} else{ if(green5>green6) {green=green6;} else{green=green5;} }} //int blue2=cm.getBlue(pixels[(i-1)*iw+j]); int blue4=cm.getBlue(pixels[i*iw+j-1]); int blue5=cm.getBlue(pixels[i*iw+j]); int blue6=cm.getBlue(pixels[i*iw+j+1]); // int blue8=cm.getBlue(pixels[(i+1)*iw+j]); //水平方向进行中值滤波 if(blue4>=blue5){ if(blue5>=blue6) {blue=blue5;} else{ if(blue4>=blue6) {blue=blue6;} else{blue=blue4;} }} else{ if(blue4>blue6) {blue=blue4;} else{ if(blue5>blue6) {blue=blue6;} else{blue=blue5;} }} pixels[i*iw+j]=alpha<<24|red<<16|green<<8|blue; //System.out.println(pixels[i*iw+j]); } } } } public int[] GetPixels() { return pixels; } }


    这是代码,我想用多线程来实现图像的中值滤波,即一个线程来处理一行像素,并行计算。
    请各位大侠给帮忙改改这个程序!
    60  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net_test
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-07 22:46:261楼 得分:12
    该回复于2008-08-01 05:22:06被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • haoxiongok
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-08 14:30:252楼 得分:12
    帮顶啦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chengyu2099
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-08 14:50:583楼 得分:12
    大学的时候对GUI很熟悉的,毕业从事java web 以后 就没有在看过这方面的资料了
    帮顶下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jingulang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-08 16:51:414楼 得分:12
    好长  只能帮定了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • reality
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-08 17:14:275楼 得分:12
    001.jpg 在什么地方
    修改 删除 举报 引用 回复