java 板


LINE

我也来分享一下以前写的 code 好了 1. 程式由 FileChooser 读路径 2. ImageIO 把图档读进 BufferedImage 3. 由 BufferedImage 取出影像阵列做处理 4. 把阵列转回 Image 显示 其中 4. 有二种作法 第二种是最近在 "电脑王" 杂志上看到再新加的 大家可以参考一下 影像处理我还是推荐用 OpenCV 啦 import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import javax.swing.*; import javax.imageio.*; public class ImgProcessFrame extends JFrame implements ActionListener{ JLabel status; // status bar JButton btn_browse, btn_process; JScrollPane pane_left, pane_right; JFileChooser chooser; String imgPath = null; JLabel img_left, img_right; public ImgProcessFrame(){ super("Image Process Frame"); // GUI JLabel lbl_browse = new JLabel("Choose Image:"); btn_browse = new JButton("Browse"); btn_browse.addActionListener(this); btn_process = new JButton("Process"); btn_process.addActionListener(this); JPanel upPanel = new JPanel(); // default: flow layout upPanel.add(lbl_browse); upPanel.add(btn_browse); upPanel.add(btn_process); pane_left = new JScrollPane(); pane_left.setColumnHeaderView(new JLabel("Input Image")); pane_right = new JScrollPane(); pane_right.setColumnHeaderView(new JLabel("Output Image")); JPanel ctrPanel = new JPanel(new GridLayout(1,2)); ctrPanel.add(pane_left); ctrPanel.add(pane_right); status = new JLabel("Status"); Container contentPane = getContentPane();// default: border layout contentPane.add(upPanel, BorderLayout.NORTH); contentPane.add(ctrPanel, BorderLayout.CENTER); contentPane.add(status, BorderLayout.SOUTH); // File chooser chooser = new JFileChooser(); //chooser.addChoosableFileFilter(new ImageFilter()); //chooser.setAcceptAllFileFilterUsed(false); //chooser.setAccessory(new ImagePreview(chooser)); img_left = new JLabel(); img_right = new JLabel(); // JFrame parameter setDefaultCloseOperation(EXIT_ON_CLOSE); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(20,20,screenSize.width-100,screenSize.height-100); setVisible(true); } public void actionPerformed(ActionEvent e){ // Get image if(e.getSource()==btn_browse){ int result = chooser.showOpenDialog(this); if(result == JFileChooser.APPROVE_OPTION){ try{ File fileObj = chooser.getSelectedFile(); imgPath = fileObj.getPath(); // display original image BufferedImage bfImg = ImageIO.read(new File(imgPath)); img_left.setIcon( new ImageIcon(bfImg) ); pane_left.setViewportView( img_left ); status.setText(" Image loaded " + fileObj.getPath()); }catch(IOException ioe){ ioe.printStackTrace(); } } } // Process image else if(e.getSource()==btn_process){ if(imgPath != null){ try{ BufferedImage bfImg = ImageIO.read(new File(imgPath)); int imgW = bfImg.getWidth(); int imgH = bfImg.getHeight(); int pixIn[] = new int[imgW*imgH]; bfImg.getRGB(0,0,imgW,imgH,pixIn,0,imgW); process(pixIn,imgW,imgH); // 建立 Image 的方法 1. Component.createImage /*Image img = createImage( new MemoryImageSource(imgW, imgH, pixIn, 0, imgW));*/ // 建立 Image 的方法 2. 直接建立 BufferedImage BufferedImage img = CreateBufferedImage_Direct(pixIn,imgW,imgH); img_right.setIcon(new ImageIcon(img)); pane_right.setViewportView( img_right ); }catch(IOException ioe){ ioe.printStackTrace(); } }else{ status.setText(" Image not yet loaded"); } } } // 处理影像的部分 public void process(int p[], int w, int h){ int r, g, b; for(int col=0; col<h-1; col++){ for(int row=0; row<w-1; row++){ r = (p[col*w+row] & 0xFF0000)>>16; g = (p[col*w+row] & 0xFF00)>>8; b = (p[col*w+row] & 0xFF); int mean = (r+g+b)/3; p[col*w+row] = 0xff000000 | mean<<16 | mean<<8 | mean; // 0xff0 00000 代表 alpha } } } public static BufferedImage CreateBufferedImage_Direct(int rgbData[], int widt h, int height){ // 建立 DataBuffer DataBuffer db = new DataBufferInt(rgbData,width*height); // 建立 Raster(包含 DataBuffer, SampleModel), 其中 SampleModel 自动用 SingleP ixelPackedSampleModel WritableRaster raster = Raster.createPackedRaster(db, width, height, width, new int[]{0xff0000,0x00ff00,0xff}, null); // 建立 ColorModel ColorModel cm = new DirectColorModel(24, 0xff0000, 0x00ff00, 0xff); // BufferedImage consists of 1. ColorModel, 2. Raster return new BufferedImage(cm, raster, false, null); } public static void main(String args[]){ JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); ImgProcessFrame ef = new ImgProcessFrame(); } } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.72.158







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP