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燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP