关注
前段时间我在VB环境下对这个JPG——》BMP,图形的缩放都有研究不过跟JAVA还是不同的

解决方案 »

  1.   

    虽然不能直接告诉你如何做但下面的网址或许对你有用
    http://java.sun.com/products/jimi/
    http://www.obrador.com/essentialjpeg/jpeg.htm
    http://rsb.info.nih.gov/ij/
      

  2.   

    JSP中我看过一个Bean可以做,把它转换一下就行了,在IBM 的论坛上有!
      

  3.   

    有个方法效率不高,不过可以试试.
    构建一个BufferedImage对象,用getGraphics()取得它的Graphics对象
    把你的ArrayList中的点用画上去,再用JPEG包把BufferedImage编码后输出就可以.还有一个好点,把所有的点转成int[]用MemoryImageSource类,不过怎么用我忘了,你自己试试,只要能生成Image对象就可以用JPEG包保存.
      

  4.   

    看中你那500分,就来了,结果楼上的已经说了,我指他说的第一种方法。
    代码就不想贴了,因为即使简单的都要写一会儿,我以前写过一个标准的图表控件,可转换为本地jpg文件,但又失真,但转png就没有。
    你如果要的话,就给我一个mail,我连源码一起发给你。
    附:my mail: [email protected]
      

  5.   

    如果你用的高版本的jdk
    应该可以使用javax.imageio.*包的东西
    可以使用imageIO.read(File f)和imageIO.write(image, Format, File)
    读取和写入一个图形
    图形类型支持jpeg,jpg,png的格式
      

  6.   

    可是我的图形存在ArrayList中不是imageBuffer中直接写好象不行啊
      

  7.   

    你在界面上了画图当然是用graphics来画
    你创建一个bufferedimage,所有要画的东西都画在这个bufferedimage上
    最后一次性画在界面上了
    同时还可以保存起来
      

  8.   

    我用的时MVC模式
    麻烦你写个将Model中的图形元素写到bufferedimage中的例子
    谢谢啦
      

  9.   

    如果方便的话
    把代码发过来我帮你看看
    [email protected]
      

  10.   

    代码太长了,我把文件保存发给你看一下吧
    private void send()
        {
          Socket sock=null;
          DataOutputStream outStream=null;
          URL myurl;
          URLConnection urlc;
          String queryString;
          String Mesg="",message="";
          //message="#"+tf.getText();
          //showStatus("Message send");
          String chatURL="http://localhost:8080/servlet";
          //Sample sam=new Sample();//实现了serializable接口
          ByteArrayOutputStream bout=new ByteArrayOutputStream(8000);
          ObjectOutputStream out=null;
          /*try
          {
            sock=new Socket("127.0.0.1",8080);
            outStream=new DataOutputStream(sock.getOutputStream());
            outStream.writeBytes("POST/servlet/acceptServlet"+"HTTP/1.1\r\n");
            outStream.writeBytes("Content-type:application/x-www-form-urlen-coded\r\n");
            outStream.writeBytes("Content-type:application/octet-stream\r\n");
            
            out=new ObjectOutputStream(new BufferedOutputStream(bout));
            out.writeObject(drawingModel);
            out.flush();
            outStream.writeBytes("Content-length:"+bout.size()+"\r\n");
            outStream.writeBytes("\r\n");
            byte[] buf=bout.toByteArray();
            outStream.write(buf);
          }
          catch(IOException ioe)
          {
           ioe.printStackTrace();
          }   */
          try
          {
            out=new ObjectOutputStream(new BufferedOutputStream(bout));
            List shapes=new ArrayList(drawingModel.getShapes());
            ListIterator shapeIterator=shapes.listIterator(shapes.size());
            while(shapeIterator.hasPrevious())
            {
              MyShape myShape=(MyShape)shapeIterator.previous();
              out.writeObject(myShape);
              out.flush();
              byte[] buf=bout.toByteArray();
              String Mesg1=new String(buf);
              Mesg+=Mesg1;
            }  
            queryString="/acceptServlet?message="+URLEncoder.encode(Mesg,"UTF-8");
            //byte[] buf=bout.toByteArray();
            //Mesg=new String(buf);
            //queryString="/acceptServlet?message="+buf;
            myurl=new URL(chatURL+queryString);
            urlc=myurl.openConnection();
            //showStatus("打开连接");
            //showStatus(urlc.toString());
            urlc.setDefaultUseCaches(false);
           urlc.setUseCaches(false);
            urlc.setDoInput(true);
            urlc.setDoOutput(false);
            urlc.connect();
            //showStatus("试图连接、读取回应");
            InputStreamReader myreader=new InputStreamReader(urlc.getInputStream());
            BufferedReader in=new BufferedReader(myreader);
            message=in.readLine();
            while(message!=null)
            {
              //tf.setText(message);
              message=in.readLine();
            }
            //showStatus("对话成功");
            //Mesg="Applet has successfully send Message to Servlet Server!\n";
            //Mesg=Mesg+"Please check the file on the server:serverlog.txt\n";
            //ta.append(Mesg);
            //b.setEnabled(true);
            return;
          }
          catch(UnsupportedEncodingException e)
          {
           //ta.append("EncodingError!\n");
           //b.setEnabled(true);
           return;
          }
         catch(MalformedURLException e2)
          {
           //ta.append("MalformedURLException!\n");
           //b.setEnabled(true);
           return;
          }
         catch(IOException e1)
          {
           e1.printStackTrace(System.err);
           //showStatus(e1.toString());
           //ta.append("IOError!\n");
           //b.setEnabled(true);
           return;
          }
        }
      

  11.   

    你实现了序列化就已经可以保存图像了
    为什么还要保存成jpg格式呢?
    如果非要这么实现,你试试这样了。BufferedImage img = new BufferedImage(int width,int height,int imageType);
    Graphics2D g2 = img.createGraphics();
    在你每次out.writeObject(myShape);时,调用g2.drawImage();
    (因为你序列化的是图形,肯定可以用drawimage画出来的,具体你可以自己看看了
    保存的时候所有的图形都已经画到img上了
    可以用imageIO.write(image, Format, File)写到jpg中了。
    不知道我说的对不对?
      

  12.   

    序列化是不是只要在类名后加上implements Serializable
    就可以了
    比如直线public class MyLine implemets Serializable
      

  13.   

    还要实现这两个方法private void writeObject(java.io.ObjectOutputStream out)
         throws IOException
     private void readObject(java.io.ObjectInputStream in)
         throws IOException, ClassNotFoundException;
      

  14.   

    这是我的MyLine类方法该如何写
    import java.awt.*;
    import java.awt.geom.*;
    import java.io.*;
    public class MyLine extends MyShape implements Serializable
    {
      public void draw(Graphics2D g2D)
      {
        configureGraphicsContext(g2D);
        Shape line=new Line2D.Float(getX1(),getY1(),getX2(),getY2());
        g2D.draw(line);
      }
      public boolean contains(Point2D myPoint)
      {
        Shape line=new Line2D.Float(getX1(),getY1(),getX2(),getY2());
        return ((java.awt.Rectangle)(line.getBounds())).contains(myPoint);
      }
    }     
      

  15.   

    是我的失误,那两个方法不是必须的,writeObject其实是ObjectOutputStream 的方法
    如果需要自己定义读写对象时的自定义方法,才必须实现上面的代码已经实现了学写自己对象,
    保存文件时就可以
    MyLine line  = new MyLine();
    FileOutputStream out = new FileOutputStream("save");
    ObjectOutputStream objOut = new ObjectOutputStream (out);
    objOut.writeObject(line);
    objOut.close();
    out.close();
      

  16.   

    没错,就是乱码!
    不要管他
    保存的目的就是能够再次读出
    用readObject的方法能都再现就可以了
      

  17.   

    我觉得还是保存成jpg文件方便
    有没有这种方法
      

  18.   

    要保存成jpg只能通过ImageIO的读写方法了
    其它的方法我不知道了
      

  19.   

    File fil=new File("C:/save.jpg");
        fil.createNewFile(); 
        FileOutputStream out = new FileOutputStream(fil);
        //ObjectOutputStream objOut = new ObjectOutputStream (out);
        Image img = createImage(100,100);
        Graphics g3 = img.getGraphics();    int i=0;
        while(shapeIterator.hasPrevious())
         {
           MyShape myShape=(MyShape)shapeIterator.previous();
           System.out.println(++i);
           img.drawImage(myShape);
           objOut.writeObject(myShape);
         } 
         imageIO.write(image, Format, fil);
         objOut.close();
         out.close();
        }
    出了一堆错误
      

  20.   

    img.drawImage(myShape);
              ^
    DrawingInternalFrame.java:204: cannot resolve symbol
    symbol  : variable objOut
    location: class DrawingInternalFrame
           objOut.writeObject(myShape);
           ^
    DrawingInternalFrame.java:206: cannot resolve symbol
    symbol  : variable image
    location: class DrawingInternalFrame
         imageIO.write(image, Format, fil);
                       ^
    DrawingInternalFrame.java:206: cannot resolve symbol
    symbol  : variable Format
    location: class DrawingInternalFrame
         imageIO.write(image, Format, fil);
                              ^
    DrawingInternalFrame.java:206: cannot resolve symbol
    symbol  : variable imageIO
    location: class DrawingInternalFrame
         imageIO.write(image, Format, fil);
      

  21.   

    img.drawImage(myShape); 改成 g3.drawImage(myShape);
    imageIO.write(image, Format, fil); 改成
    imageIO.write(img, ".jpg", fil); 试试下面的
    File fil=new File("C:/save.jpg");      
        Image img = createImage(100,100);
        Graphics g3 = img.getGraphics();
        int i=0;
        while(shapeIterator.hasPrevious())
         {
           MyShape myShape=(MyShape)shapeIterator.previous();
           System.out.println(++i);
           g3.drawImage(myShape);       
         } 
         imageIO.write(img, ".jpg", fil);   
      

  22.   

    最后一句应该是ImageIO.write(img, "jpg", fil); 
    还得加上import javax.ImageIO.*;
      

  23.   

    我的ImageIO包不存在
    我用的jdk1.4
      

  24.   

    javax.imageio.*;
    小写,我忘了,是jdk1.4.1版本的
    你的应该也有的
      

  25.   

    还是有两个错误
    DrawingInternalFrame.java:201: cannot resolve symbol
    symbol  : method drawImage (MyShape)
    location: class java.awt.Graphics
           g3.drawImage(myShape);
             ^
    DrawingInternalFrame.java:203: cannot resolve symbol
    symbol  : variable imageio
    location: class DrawingInternalFrame
         imageio.write(img, ".jpg", fil);
      

  26.   

    算了看来这个问题比较复杂
    问个简单的问题解决了就结贴了500分照送
    我怎样才能得到BufferedImage的内容长度
      

  27.   

    好像你是在applet里
    那就用public int getWidth(ImageObserver observer)
    public int getHeight(ImageObserver observer)
    这个方法
    调用的时候用img.getWidth(this)
    就可以了