Do you drink java?



                像寫情書一樣coding

           

          [Image] 讀取數(shù)碼照片中的EXIF信息

          相信大家都有使用數(shù)碼相機拍照的經(jīng)歷,一張數(shù)碼照片可以包含的內(nèi)容遠遠超過了我們當前觀察到的景物,他可能包括攝影時的光圈、快門、ISO、日期時間等各種與當時攝影條件相關(guān)的訊息,相機品牌型號,色彩編碼,拍攝時錄制的聲音以及全球定位系統(tǒng)(GPS)等信息。這些信息都是存放在一個叫做Exif的文件里,然后把Exif文件放置在我們熟知的 JPEG/TIFF 文件的頭部,也就是說 EXIF 信息是鑲嵌在 JPEG/TIFF 圖像文件格式內(nèi)的一組拍攝參數(shù)。

          我在網(wǎng)上找到一個開源的開發(fā)工具包Metadata-Extractor,使用它可以像ACDSee等圖像軟件一樣讀取數(shù)碼照片的Exif信息。

          我寫了一個小Demo程序演示通過使用metadata-extractor-2.2.2讀取數(shù)碼照片的Exif信息并從Exif中讀取圖像縮略圖。
          import?java.io.*;
          import?java.nio.*;
          import?java.nio.channels.*;
          import?java.util.*;

          import?com.drew.imaging.jpeg.*;
          import?com.drew.metadata.*;
          import?com.drew.metadata.exif.*;


          ?
          public?class?ExifExtractor?{
          ??
          public?ExifExtractor()?{
          ??}


          ??
          public?static?void?main(String[]?args)?{
          ????
          try?{
          ??????Metadata?metadata?
          =?JpegMetadataReader.readMetadata(new?File("o_P4140147.JPG.jpg"));

          ??????Iterator?directories?
          =?metadata.getDirectoryIterator();
          ??????
          while?(directories.hasNext())?{
          ????????Directory?directory?
          =?(Directory)?directories.next();

          ????????Iterator?tags?
          =?directory.getTagIterator();
          ????????
          while?(tags.hasNext())?{
          ??????????Tag?tag?
          =?(Tag)?tags.next();

          ??????????
          //?modify?Exif
          //??????????if?(tag.getTagName().equalsIgnoreCase("User?Comment"))?{
          //??????????????????????Directory?exifDirectory?=?metadata.getDirectory(ExifDirectory.class);
          //??????????????????????exifDirectory.setString(tag.getTagType(),?"LeonChen");
          //??????????}

          ??????????
          //?read?thumbnail
          ??????????if?(tag.getTagName().equalsIgnoreCase("Thumbnail?Data"))?{
          ????????????Directory?exifDirectory?
          =?metadata.getDirectory(ExifDirectory.class);

          ????????????
          byte[]?dataBuffer?=?exifDirectory.getByteArray(tag.getTagType());
          ????????????FileChannel?channel?
          =?new?RandomAccessFile(new?File("thumbnail.jpg"),
          ????????????????
          "rw").getChannel();
          ????????????MappedByteBuffer?fileBuffer?
          =?channel.map(FileChannel.MapMode.
          ????????????????READ_WRITE,?
          0,?dataBuffer.length);
          ????????????fileBuffer.put(dataBuffer);
          ????????????fileBuffer.force();
          ????????????channel.close();
          ??????????}


          ??????????
          //?print?exif
          ??????????System.out.println(tag);
          ????????}

          ??????}

          ????}

          ????
          catch?(FileNotFoundException?ex)?{
          ??????ex.printStackTrace();
          ????}

          ????
          catch?(IOException?ex)?{
          ??????ex.printStackTrace();
          ????}

          ????
          catch?(MetadataException?ex)?{
          ??????ex.printStackTrace();
          ????}

          ????
          catch?(JpegProcessingException?ex)?{
          ??????ex.printStackTrace();
          ????}

          ??}

          }


          我在上面的測試程序里注釋了一段代碼,他們可以在內(nèi)存中修改Exif中某一節(jié)點的信息,但是我不知道怎樣才能將修改后的Exif信息保存到文件,如果你知道方法,請給我留言。

          測試圖片下載地址:
          http://www.aygfsteel.com/images/blogjava_net/leon/2174/o_P4140147.JPG

          EXIF參考:
          http://www.exif.org

          posted @ 2005-11-29 17:04 leon 閱讀(2595) | 評論 (5)編輯 收藏

          [Swing] 布局管理器 - OverlayLayout

          OverlayLayout是用于排列重疊組件的布局管理器。它的用途是以一些對齊的點為基準將一些組件層疊的放置在布局容器中。

          組件的橫軸和縱軸的對齊點介于0.0和1.0之間。橫軸(X軸)上0.0代表組件的左側(cè)面,1.0代表組件的右側(cè)面;縱軸(Y軸)上0.0和1.0分別代表組件的頂部和底部。

          構(gòu)造函數(shù)
          public OverlayLayout(Container target)

          因為構(gòu)造函數(shù)不會為target對象安裝結(jié)果布局管理器,所以我們還必須調(diào)用setLayout()來完成此功能。
          JPanel p1 = new JPanel();
          OverlayLayout overlay 
          = new OverlayLayout(p1);
          p1.setLayout(overlay); 

          在OverlayLayout布局管理器中,每個組件都有一對橫縱坐標值,每個組件的位置只和它本身的橫縱坐標值有關(guān),換句話說就是組件以他自己的位置作為基準,橫軸上0.0和1.0分別代表組件的左側(cè)面和右側(cè)面;縱軸上0.0和1.0分別代表組件的頂部和底部,和容器位置無關(guān)。如果一個組件的alignmentX屬性設(shè)置為0.5,原本左側(cè)面的位置對應0.0,現(xiàn)在變成了0.5,那么,現(xiàn)在組件的位置就要向左移動width/2的距離,使左側(cè)面的位置對應現(xiàn)在的0.0??v軸亦是如此,明白了嗎?

          為了容易理解,我們來看《Java Swing》中關(guān)于OverlayLayout的一段樣例程序,它可以編譯運行。如圖,你可以在輸入框中調(diào)節(jié)容器中3個按鈕的X,Y軸的值來看他們在容器中的位置是怎樣改變的,多試幾次,你就可以完全理解OverlayLayout。

          OverlayTest.jpg
          // OverlayTest.java
          // A test of the OverlayLayout manager allowing experimentation.
          //

          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;

          public class OverlayTest extends JFrame {

              
          public OverlayTest() {
                  
          super("OverlayLayout Test");
                  setSize(
          500300);
                  setDefaultCloseOperation(EXIT_ON_CLOSE);

                  
          final Container c = getContentPane();
                  c.setLayout(
          new GridBagLayout());

                  
          final JPanel p1 = new GridPanel();
                  
          final OverlayLayout overlay = new OverlayLayout(p1);
                  p1.setLayout(overlay);

                  
          final JButton jb1 = new JButton("B1");
                  
          final JButton jb2 = new JButton("B2");
                  
          final JButton jb3 = new JButton("B3");

                  Dimension b1 
          = new Dimension(6050);
                  Dimension b2 
          = new Dimension(8040);
                  Dimension b3 
          = new Dimension(10060);

                  jb1.setMinimumSize(b1);
                  jb1.setMaximumSize(b1);
                  jb1.setPreferredSize(b1);
                  jb2.setMinimumSize(b2);
                  jb2.setMaximumSize(b2);
                  jb2.setPreferredSize(b2);
                  jb3.setMinimumSize(b3);
                  jb3.setMaximumSize(b3);
                  jb3.setPreferredSize(b3);

                  SimpleReporter reporter 
          = new SimpleReporter();
                  jb1.addActionListener(reporter);
                  jb2.addActionListener(reporter);
                  jb3.addActionListener(reporter);

                  p1.add(jb1);
                  p1.add(jb2);
                  p1.add(jb3);

                  JPanel p2 
          = new JPanel();
                  p2.setLayout(
          new GridLayout(2,6));
                  p2.add(
          new JLabel("B1 X", JLabel.CENTER));
                  p2.add(
          new JLabel("B1 Y", JLabel.CENTER));
                  p2.add(
          new JLabel("B2 X", JLabel.CENTER));
                  p2.add(
          new JLabel("B2 Y", JLabel.CENTER));
                  p2.add(
          new JLabel("B3 X", JLabel.CENTER));
                  p2.add(
          new JLabel("B3 Y", JLabel.CENTER));
                  p2.add(
          new JLabel(""));

                  
          final JTextField x1 = new JTextField("0.0"4); // Button1 x alignment
                  final JTextField y1 = new JTextField("0.0"4); // Button1 y alignment
                  final JTextField x2 = new JTextField("0.0"4); 
                  
          final JTextField y2 = new JTextField("0.0"4); 
                  
          final JTextField x3 = new JTextField("0.0"4); 
                  
          final JTextField y3 = new JTextField("0.0"4); 

                  p2.add(x1);
                  p2.add(y1);
                  p2.add(x2);
                  p2.add(y2);
                  p2.add(x3);
                  p2.add(y3);


                  GridBagConstraints constraints 
          = new GridBagConstraints();
                  c.add(p1, constraints);

                  constraints.gridx 
          = 1;
                  JButton updateButton 
          = new JButton("Update");
                  updateButton.addActionListener(
          new ActionListener() {
                      
          public void actionPerformed(ActionEvent ae) {
                          jb1.setAlignmentX(
                              Float.valueOf(x1.getText().trim()).floatValue());
                          jb1.setAlignmentY(
                              Float.valueOf(y1.getText().trim()).floatValue());
                          jb2.setAlignmentX(
                              Float.valueOf(x2.getText().trim()).floatValue());
                          jb2.setAlignmentY(
                              Float.valueOf(y2.getText().trim()).floatValue());
                          jb3.setAlignmentX(
                              Float.valueOf(x3.getText().trim()).floatValue());
                          jb3.setAlignmentY(
                              Float.valueOf(y3.getText().trim()).floatValue());

                          p1.revalidate();
                      }

                  }
          );
                  c.add(updateButton, constraints);

                  constraints.gridx 
          = 0;
                  constraints.gridy 
          = 1;
                  constraints.gridwidth 
          = 2;
                  c.add(p2, constraints);
              }


              
          public static void main(String args[]) {
                  OverlayTest ot 
          = new OverlayTest();
                  ot.setVisible(
          true);
              }


              
          public class SimpleReporter implements ActionListener {
                  
          public void actionPerformed(ActionEvent ae) {
                      System.out.println(ae.getActionCommand());
                  }

              }


              
          public class GridPanel extends JPanel {
                  
          public void paint(Graphics g) {
                      
          super.paint(g);
                      
          int w = getSize().width;
                      
          int h = getSize().height;

                      g.setColor(Color.red);
                      g.drawRect(
          0,0,w-1,h-1);
                      g.drawLine(w
          /2,0,w/2,h);
                      g.drawLine(
          0,h/2,w,h/2);
                  }

              }

          }



          最后提醒,使用OverlayLayout布局管理器關(guān)鍵要記住X,Y軸對應組件位置,和容器沒有關(guān)系。只要明白這一點,使用還是很簡單方便的,我用OverlayLayout布局管理器clone了一個PhotoShop的工具面板。
          ToolWidget.jpg

          posted @ 2005-11-02 23:08 leon 閱讀(3871) | 評論 (0)編輯 收藏

          [Image] 將屏幕截圖保存成圖像文件

          import ?java.io. * ;
          import ?java.awt. * ;
          import ?java.awt.image. * ;
          import ?javax.imageio. * ;

          public ? class ?CropScreen? {
          ??
          public ? static ? void ?main(String[]?args)? {
          ????
          try ? {
          ??????Toolkit?toolkit?
          = ?Toolkit.getDefaultToolkit();
          ??????Dimension?screenSize?
          = ?toolkit.getScreenSize();
          ??????Rectangle?screenRect?
          = ? new ?Rectangle(screenSize);

          ??????Robot?robot?
          = ? new ?Robot();
          ??????BufferedImage?image?
          = ?robot.createScreenCapture(screenRect);
          ??????ImageIO.write(image,?
          " jpg " ,? new ?File( " screen.jpg " ));
          ????}

          ????
          catch ?(Exception?ex)? {
          ??????ex.printStackTrace();
          ????}

          ??}

          }

          posted @ 2005-10-26 11:39 leon 閱讀(1268) | 評論 (0)編輯 收藏

          [Image] 使用JAI將實現(xiàn)RenderedImage接口的圖像對象序列化

          我們都知道,圖像對象可以編碼成指定圖像格式文件保存在硬盤上,需要時再對其進行解碼讀入內(nèi)存。但是除了這樣還有別的辦法可以將圖像對象保存在硬盤上嗎?熟悉Java I/O 的人也許可以想到采用對象序列化(Object serialization)試一試,很好,但是如果你研究了 BufferedImage?類的結(jié)構(gòu)后就會大失所望(至少當時我是這樣)。
          BufferedImage.jpg

          BufferedImage?提供一般圖像管理。BufferedImage 對象包括另外兩個對象:Raster 和 ColorModel。Raster 對象包含另外兩個對象:DataBuffer 和 SampleModel。不幸的是,他們都沒有實現(xiàn)序列化所必需的 Serializable 接口,所以無法直接對他們進行對象序列化。

          我在學習 JAI 的時候發(fā)現(xiàn)了 javax.media.jai.remote 包里有一個類 SerializableRenderedImage,這個類實現(xiàn)了RenderedImage, Serializable 接口,可以將 RanderedImage 對象作為構(gòu)造函數(shù)的參數(shù)實例化一個可以序列化的圖像對象。

          javax.media.jai.remote.SerializableRenderedImage

          public final class SerializableRenderedImage
          extends Object
          implements RenderedImage, Serializable

          SerializableRenderedImage(RenderedImage?source)
          ??????????Constructs a SerializableRenderedImage wrapper for a RenderedImage source.
          SerializableRenderedImage(RenderedImage?source, boolean?useDeepCopy)
          ??????????Constructs a SerializableRenderedImage wrapper for a RenderedImage source.
          SerializableRenderedImage(RenderedImage?source, boolean?useDeepCopy, OperationRegistry?registry, String?formatName, TileCodecParameterList?encodingParam, TileCodecParameterList?decodingParam)
          ??????????Constructs a SerializableRenderedImage wrapper for a RenderedImage source.

          查看JDK的文檔可以知道無論 Java 2D 中的 BufferedImage 還是 JAI 中的 PlanarImage 都實現(xiàn)自 RenderedImage 接口,也就是說所有實現(xiàn)自 RenderedImage 接口的對象均可作為參數(shù)包裝出一個 SerializableRenderedImage 類型對象,將其序列化。

          下面是一個簡單的例子說明了這個類的使用方法:

          import?java.io.*;
          import?javax.media.jai.remote.*;

          import?java.awt.image.*;

          public?class?SomeSerializableClass
          ????
          implements?Serializable?{
          ??
          protected?transient?RenderedImage?image;

          ??
          //?Fields?omitted.

          ??
          public?SomeSerializableClass(RenderedImage?image)?{
          ????
          this.image?=?image;
          ??}


          ??
          //?Methods?omitted.

          ??
          //?Serialization?method.
          ??private?void?writeObject(ObjectOutputStream?out)?throws?IOException?{
          ????out.defaultWriteObject();
          ????out.writeObject(
          new?SerializableRenderedImage(image,?true));
          ??}


          ??
          //?Deserialization?method.
          ??private?void?readObject(ObjectInputStream?in)?throws?IOException,
          ??????ClassNotFoundException?
          {
          ????in.defaultReadObject();
          ????image?
          =?(RenderedImage)?in.readObject();
          ??}

          }

          posted @ 2005-10-18 17:36 leon 閱讀(2842) | 評論 (1)編輯 收藏

          [Image] AWT使用ImageProducer/ImagConsumer模式加載和顯示圖像的原理

          以前寫過2篇關(guān)于AWT中圖像加載顯示方法的文章,最近又多了一些對于 ImageProducer / ImagConsumer 模式的一些理解,嘗試著用文字總結(jié)了一下,接著還想再寫一篇介紹 AWT 中圖像過濾的原理和方法。你可能認為現(xiàn)在學習 AWT 中的成像方法對于開發(fā)中已經(jīng)沒有太大的意義,因為已經(jīng)有了 Java 2D 和 JAI ,但是我在實際工作中感到還是無法完全離開 AWT,特別是在一些基本的應用上。而且我覺得理解 AWT 的 Producer / Consumer (push) model 對于理解 Java 2D 的 Immediate mode model 和 JAI 的 Pipeline (pull) model 的都是有好處的。

          因為水平有限,這方面學習資料相對也不豐富,我也不知道我的理解或想法是否完全正確或者表述清楚,感興趣的朋友可以當作學習參考,希望能夠和我聯(lián)系進行進一步的討論。



          AWT 使用 ImageProducer / ImagConsumer 模式,支持加載和顯示 GIF 圖像文件格式和 JPEG 圖像文件格式。因為圖像的加載和顯示是異步方式進行的,所以有大量加載和顯示的技術(shù)。

          在 AWT 中,提供了一個 java.awt.Image 類。java.awt.Image 類代表一個圖像對象被作為參數(shù)傳遞給其他用來顯示和處理圖像的其他 AWT 對象使用。例如,通過調(diào)用 Graphics.drawImage(java.awt.Image, int, int, ImageObserver) 方法,可以在組件中畫出圖像。

          java.awt.Image 是一個定義方法的抽象類,它定義的方法提供的對圖像信息的訪問。而創(chuàng)建和處理圖像的基本結(jié)構(gòu)則在 java.awt.image 包中。注意,這里不要和 java.awt.Image 發(fā)生混淆。

          AWT? 加載和顯示圖像使用的是 ImageProducer / ImagConsumer 模式,我們必須了解3個術(shù)語,ImageProducer(圖像生產(chǎn)者),ImageConsumer(圖像消費者)和ImageObserver(圖像觀察者)。

          ImageProducer 負責生產(chǎn)圖像的位,ImagConsumer 接受圖像的位,ImageObserver 監(jiān)視 ImageProducer 的圖像生產(chǎn)過程。ImageProducer 生產(chǎn)傳遞給 ImagConsumer 與圖像相關(guān)的位。因為圖像生產(chǎn)過程是異步進行的,并不是一次性生產(chǎn)所有圖像位,所以當 ImageProducer 加載圖像時,ImageObserver 用來監(jiān)視它的進展情況。因為 java.awt.Component 實現(xiàn)了 ImageObserver 接口,所以 AWT 中的每個組件都可以是ImageObserver,當一個給定的 ImageProducer 進行異步操作時,這個 ImageObserver 可以選擇是否被更新。java.awt.image 包為 ImageProducer,ImagConsumer 和 ImageObserver 都定義了接口。

          ImageProducer
          和圖像相關(guān)的位并不存儲在 java.awt.Image 中,每個圖像都維護一個和一個 ImageProducer?的關(guān)聯(lián)。這個 ImageProducer?的責任是生產(chǎn)圖像的位并將它們傳送給 ImagConsumer,用于過濾該圖像。

          java.awt.image軟件包中,F(xiàn)ilteredImageSource(被過濾的圖像源)和 MemoryImageSource(內(nèi)存的圖像源)實現(xiàn)了 ImageProducer? 接口,是 ImageProducer?。


          ImagConsumer
          java.awt.image軟件包中,ImageFilter(圖像過濾器)和 PixelGrabber(像素抓取器)實現(xiàn)了 ImagConsumer 接口,是 ImagConsumer。


          ImageProducer?和 ImagConsumer 的詳細介紹請閱讀 使用 ImageProducer? / ImagConsumer 進行圖像過濾


          ImageObserver
          ImageObserver接口中,定義了一個常數(shù)集合和一個方法:

          public boolean imageUpdate(image img, int flags, int x, int y, int width, int height);

          ImageObserver的常數(shù)
          標志 含義
          ABORT 圖像加載被中斷
          ALLBITS 所有的位都已加載給圖像
          ERROR 在加載過程中發(fā)生錯誤
          FRAMEBITS 多幀圖像的一個幀被傳送,一般用于GIF
          HEIGHT 圖像的高度已經(jīng)可用
          PROPERTIES 圖像的屬性已經(jīng)可用
          SOMEBITS 圖像的縮放變體的多個位已經(jīng)可用
          WIDTH 圖像的寬度已經(jīng)可用

          參數(shù) flags 的作用是通知圖像觀察者圖像生產(chǎn)的進展情況。這些常數(shù)代表傳遞給 ImageObserver.imageUpdate() 的 flags 參數(shù)中的位。

          當 Component 作為 ImageObserver 時,一旦圖像有新的部分被加載,就會調(diào)用 Component.imageUpdate() 方法,imageUpdate() 再調(diào)用 repaint() 重新繪制圖像。repaint() 將先調(diào)用 update() 方法清除組件背景,再由 update() 方法調(diào)用 paint() 方法繪制圖像。我們可以通過重載 imageUpdate() 方法控制組件何時被更新,重載 update() 方法控制是否每次重繪都要清除背景圖像(每次重繪都清除背景圖像會造成畫面閃爍)。


          為了更好的理解,下面我們來看幾個樣例程序:

          例1,圖像位在需要之前不被生產(chǎn)

          import?java.net.URL;
          import?java.applet.Applet;
          import?java.awt.Graphics;
          import?java.awt.Image;

          public?class?ImageTestAppletSimple?extends?Applet{
          ????
          private?Image?im;
          ????
          ????
          public?void?init(){
          ????????URL?codebase?
          =?getCodeBase();
          ????????System.out.println(codebase);
          ????????
          ????????im?
          =?getImage(codebase,"flower.jpg");
          ????????
          ????????System.out.print(
          "Image?width?=?"?+?im.getWidth(this));
          ????????System.out.println(
          " hight?=?"?+?im.getHeight(this));
          ????}

          ????
          ????
          public?void?paint(Graphics?g){
          ????????g.drawImage(im,
          0,0,this);
          ????}

          }

          輸出結(jié)果:
          image width = -1 height = -1

          圖像的高度和寬度只有在圖像被完全加載后才是有效的,輸出結(jié)果說明 java.awt.image 相關(guān)的圖像位在需要之前不被生產(chǎn)。


          例2,圖像異步生產(chǎn)

          import?java.net.URL;
          import?java.applet.Applet;
          import?java.awt.Graphics;
          import?java.awt.Image;

          public?class?ImageTestAppletSimple2?extends?Applet{
          ????
          private?Image?im;
          ????
          ????
          public?void?init(){
          ????????im?
          =?getImage(getCodeBase(),"flower.jpg");
          ????}

          ????
          ????
          public?void?paint(Graphics?g){
          ????????System.out.println(
          "drawing?image...");
          ????????System.out.println(g.drawImage(im,
          0,0,this));
          ????}

          }

          輸出結(jié)果:
          drawing?image...
          false
          drawing?image...
          false
          drawing?image...
          false
          drawing?image...
          true

          輸出結(jié)果說明組件作為 ImageObserver ,監(jiān)視 ImageProducer 異步生產(chǎn)圖像,一旦有新的圖像位被生產(chǎn)時就重繪圖像,圖像完全加載后 drawImage() 方法返回 true。


          例3,重載 ImageObserver 的 imageUpdate() 方法,在圖像完全加載前不調(diào)用 repaint()

          import?java.applet.Applet;
          import?java.awt.Graphics;
          import?java.awt.Image;

          public?class?ImageTestAppletWithUpdate?extends?Applet{
          ????
          private?Image?im;
          ????
          ????
          public?void?init(){
          ????????im?
          =?getImage(getCodeBase(),"flower.jpg");
          ????????
          ????????System.out.print(
          "Image?width?=?"?+?im.getWidth(this));
          ????????System.out.println(
          "hight?=?"?+?im.getHeight(this));
          ????}

          ????
          ????
          public?void?paint(Graphics?g){
          ????????g.drawImage(im,
          0,0,this);
          ????}

          ????
          ????
          public?boolean?imageUpdate(Image?image,int?flags,int?x,int?y,int?w,int?h){
          ????????System.out.println(
          "imageUpdate():x="?+?x?+?",y="?+?y?+?",w="?+?w?+?",h="?+?h);
          ????????
          ????????
          if((flags?&?ALLBITS)?==?0)
          ????????????
          return?true;
          ????????
          else
          ????????
          {
          ????????????repaint();
          ????????????
          return?false;
          ????????}

          ????}

          }



          例4,重載? Component.update() 方法,被調(diào)用時不清除背景圖像,直接調(diào)用 paint() 方法繪制圖像,消除閃爍

          import?java.applet.Applet;
          import?java.awt.Graphics;
          import?java.awt.Image;

          public?class?ImageTestAppletWithSmoothDynamicUpdate?extends?Applet{
          ????
          private?Image?im;
          ????
          ????
          public?void?init(){
          ????????im?
          =?getImage(getCodeBase(),"hl.jpg");
          ????????
          ????????System.out.print(
          "Image?width?=?"?+?im.getWidth(this));
          ????????System.out.println(
          "hight?=?"?+?im.getHeight(this));
          ????}

          ????
          ????
          public?void?paint(Graphics?g){
          ????????g.drawImage(im,
          0,0,this);
          ????}

          ????
          ????
          public?boolean?imageUpdate(Image?image,int?flags,int?x,int?y,int?w,int?h){
          ????????System.out.println(
          "imageUpdate():x="?+?x?+?",y="?+?y?+?",w="?+?w?+?",h="?+?h);
          ????????
          ????????repaint();
          ????????
          ????????
          if((flags?&?ALLBITS)?==?0)
          ????????????
          return?true;
          ????????
          else
          ????????????
          return?false;
          ????}

          ????
          ????
          public?void?update(Graphics?g){
          ????????paint(g);
          ????}

          }

          ?

          posted @ 2005-10-11 10:35 leon 閱讀(2633) | 評論 (3)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 

          導航

          統(tǒng)計

          公告

          DSC_0106.jpg
          本博客已經(jīng)搬家到CSDN
          http://blog.csdn.net/chenweionline




          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          About Technology

          My Favorite Website

          搜索

          積分與排名

          最新評論

          • 1.?re: 胃痙攣
          • 兄弟們你們都做胃鏡了嗎開的啥藥?有什么養(yǎng)胃秘方啊?請賜教??!
          • --我也進來了
          • 2.?re: 胃痙攣
          • @痛啊
            我感覺比生孩子還疼,生孩子還能有意識呢!這種疼還叫不出來連說話的力氣都沒了
          • --我也進來了
          • 3.?re: 胃痙攣
          • 評論內(nèi)容較長,點擊標題查看
          • --我也進來了
          • 4.?re: 胃痙攣
          • 我都周期性的發(fā)作,算來有4年了 。每年最少一次,一次最少2天。吃了好多藥就差沒去做胃鏡了。 剛剛發(fā)作就隨便煮了點姜湯喝下就好了些,不知道還會不會發(fā)作了。
          • --許家洛
          • 5.?re: 胃痙攣
          • 我昨晚也疼的要死。。上次疼的直接120送醫(yī)院了,一上120我竟然就不疼了,醫(yī)院里掉了瓶鹽水就放回家了。這次正好國外旅游中,幾乎疼了一整晚,整個在床上翻滾狀態(tài)了。今天不疼了,就是整個人難受。。。求助阿
          • --胃疼
          • 6.?re: [Swing]在 JFileChooser 中進行文件驗證的小技巧
          • 輸入*還是會有問題
          • --ngh
          • 7.?re: 胃痙攣[未登錄]
          • 昨晚一夜的身不如死的感覺,胃痙攣兄不要來了吧 ,求你了
          • --李飛
          • 8.?re: 胃痙攣
          • 評論內(nèi)容較長,點擊標題查看
          • --daidai
          • 9.?re: 胃痙攣
          • 評論內(nèi)容較長,點擊標題查看
          • --痛啊
          • 10.?re: 胃痙攣
          • 媽啊 痛的快死了~!第一次感覺過這樣的痛啊~!和女的生孩子有的一比了吧~!哭哭哭~!
          • --痛啊

          閱讀排行榜

          主站蜘蛛池模板: 六枝特区| 自治县| 阳信县| 韩城市| 磴口县| 临漳县| 鸡泽县| 麻栗坡县| 景德镇市| 如东县| 曲麻莱县| 正安县| 蒙城县| 江川县| 浮山县| 石屏县| 大港区| 九江市| 黑水县| 彩票| 长治县| 齐齐哈尔市| 化隆| 吉安市| 古田县| 江门市| 钟祥市| 上犹县| 尚志市| 乌兰浩特市| 胶州市| 林口县| 彭水| 祥云县| 安徽省| 高阳县| 阳西县| 乌海市| 治县。| 时尚| 郑州市|