BufferedImage and InternetExplorer 6

hi,
I wrote an animation applet which uses BufferedImages to store the single slides.
(The animation must be realized as java-applet because the images are encoded
bit-wise and compressed on server side thus have to be decoded and inflated locally...)
Now I had to recognize that the IE 6.0 -JVM doesn't know the BufferedImage class....
I tried to write an own imagebuffer class but it is by far too slow. :o(
Is it possible to make the InternetExplorer load the BufferedImage class (and linked classes)
dynamically from the Sun-server or can I get these classes to place them on my own server?
Or has anyone written an imagebuffer class which can be displayed by a Graphics object
efficiently...?
any help would be great ... (for a non-profit project), martin

Why don't you put the BufferedImage.class in your jar file ?
You could also ask clients to install the java plugin:
http://java.sun.com/docs/books/tutorial/information/examples.html#plugin

Similar Messages

  • Need help: BufferedImage and zooming

    please help me understand what i am doing wrong. i am having a hard time understanding the concept behind BufferedImage and zooming. the applet code loads an image as its background. after loading, you can draw line segments on it. but when i try to zoom in, the image in the background remains the same in terms of size, line segments are the only ones that are being zoomed, and the mouse coordinates are confusing.
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.awt.geom.*;
    import javax.swing.*;
    import javax.imageio.*;
    import java.io.*;
    import java.util.ArrayList;
    import java.io.IOException;
    import java.net.URL;
    import java.awt.image.*;
    public class Testing extends JApplet {
         private String url;
         private Map map;
         public void init() {
         public void start()
              url = "http://localhost/image.gif";
                  map = new Map(url);
                 getContentPane().add(map, "Center");
                 validate();
                 map.validate();
    class Map extends JPanel implements MouseListener, MouseMotionListener{
         private Image image;
         private ArrayList<Point2D> points;
         private ArrayList<Line2D> lineSegment;
         private Point2D startingPoint;
         private int mouseX;
         private int mouseY;
         private BufferedImage bimg;
         private AffineTransform xform;
         private AffineTransform inverse;
         private double zoomFactor = 1;
         public Map(String url)
                         super();
              //this.image = image;
              try
                   image = ImageIO.read(new URL(url));
              catch(Exception e)
              Insets insets = getInsets();
              xform = AffineTransform.getTranslateInstance(insets.left, insets.top);
              xform.scale(zoomFactor,zoomFactor);
              try {
                   inverse = xform.createInverse();
              } catch (NoninvertibleTransformException e) {
                   System.out.println(e);
              points = new ArrayList();
              startingPoint = new Point();
              bimg = new BufferedImage(this.image.getWidth(this), this.image.getHeight(this), BufferedImage.TYPE_INT_ARGB);
              repaintBImg();
              addMouseListener(this);
              addMouseMotionListener(this);
         public void paintComponent(Graphics g)
            Graphics2D g2d = (Graphics2D)g;
              g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
              g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING , RenderingHints.VALUE_RENDER_QUALITY ));
            bimg = (BufferedImage)image;
            g2d.drawRenderedImage(bimg, xform);
            if(!points.isEmpty())
                 for(int i=0; i<points.size(); i++)
                      if(i > 0)
                           drawLineSegment(g2d,points.get(i-1),points.get(i));
                      drawPoint(g2d, points.get(i));
            if(startingPoint != null)
                drawTempLine(startingPoint, g2d);
            else
                mouseX = 0;
                mouseY = 0;
         private void repaintBImg()
              bimg.flush();
              Graphics2D g2d = bimg.createGraphics();
              g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
              g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING , RenderingHints.VALUE_RENDER_QUALITY ));
            g2d.drawRenderedImage(bimg, xform);
            g2d.dispose();
         private void drawPoint(Graphics2D g2d, Point2D p)
            int x = (int)(p.getX() * zoomFactor);
            int y = (int)(p.getY() * zoomFactor);
            int w = (int)(13 * zoomFactor);
            int h = (int)(13 * zoomFactor);
              g2d.setColor(Color.ORANGE);
              g2d.setStroke(new BasicStroke(1.0F));
            g2d.fillOval(x - w / 2, y - h / 2, w, h);
            g2d.setColor(Color.BLACK);
            g2d.drawOval(x - w / 2, y - h / 2, w - 1, h - 1);
         private void drawLineSegment(Graphics2D g2d, Point2D p1, Point2D p2)
              double x1 = p1.getX() * zoomFactor;
                 double y1 = p1.getY() * zoomFactor;
                 double x2 = p2.getX() * zoomFactor;
                 double y2 = p2.getY() * zoomFactor;
                 g2d.setColor(Color.RED);
                 g2d.setStroke(new BasicStroke(3.0F));
                 g2d.draw(new java.awt.geom.Line2D.Double(x1, y1, x2, y2));
             private void drawTempLine(Point2D p, Graphics2D g2d)
                 int startX = (int)(p.getX() * zoomFactor);
                 int startY = (int)(p.getY() * zoomFactor);
                 if(mouseX != 0 && mouseY != 0)
                         g2d.setColor(Color.RED);
                          g2d.setStroke(new BasicStroke(2.0F));
                          g2d.drawLine(startX, startY, mouseX, mouseY);
         public void mouseClicked(MouseEvent e)
         public void mouseDragged(MouseEvent e)
              mouseX = (int)(e.getX()*zoomFactor);
              mouseY = (int)(e.getY()*zoomFactor);
              repaint();
         public void mousePressed(MouseEvent e)
              if(e.getButton() == 1)
                   points.add(inverse.transform(e.getPoint(), null));
                   if(points.size() > 0)
                        startingPoint = points.get(points.size()-1);
                        mouseX = mouseY = 0;
                   repaint();
              else if(e.getButton() == 2)
                   zoomFactor = zoomFactor + .05;
                   repaintBImg();
              else if(e.getButton() == 3)
                   zoomFactor = zoomFactor - .05;
                   repaintBImg();
         public void mouseReleased(MouseEvent e)
              if(e.getButton() == 1)
                   points.add(inverse.transform(e.getPoint(), null));
              repaint();
         public void mouseEntered(MouseEvent mouseevent)
         public void mouseExited(MouseEvent mouseevent)
         public void mouseMoved(MouseEvent mouseevent)
    }Message was edited by:
    hardc0d3r

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.awt.geom.*;
    import java.io.*;
    import java.net.URL;
    import java.util.*;
    import javax.imageio.*;
    import javax.swing.*;
    public class ZoomTesting extends JApplet {
        public void init() {
            //String dir = "file:/" + System.getProperty("user.dir");
            //System.out.printf("dir = %s%n", dir);
            String url = "http://localhost/image.gif";
                         //dir + "/images/cougar.jpg";
            MapPanel map = new MapPanel(url);
            getContentPane().add(map, "Center");
        public static void main(String[] args) {
            JApplet applet = new ZoomTesting();
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.getContentPane().add(applet);
            f.setSize(400,400);
            f.setLocation(200,200);
            applet.init();
            f.setVisible(true);
    class MapPanel extends JPanel implements MouseListener, MouseMotionListener {
        private BufferedImage image;
        private ArrayList<Point2D> points;
        private Point2D startingPoint;
        private int mouseX;
        private int mouseY;
        private AffineTransform xform;
        private AffineTransform inverse;
        RenderingHints hints;
        private double zoomFactor = 1;
        public MapPanel(String url) {
            super();
            try {
                image = ImageIO.read(new URL(url));
            } catch(Exception e) {
                System.out.println(e.getClass().getName() +
                                   " = " + e.getMessage());
            Map<RenderingHints.Key, Object> map =
                        new HashMap<RenderingHints.Key, Object>();
            map.put(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            map.put(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY);
            hints = new RenderingHints(map);
            setTransforms();
            points = new ArrayList<Point2D>();
            startingPoint = new Point();
            addMouseListener(this);
            addMouseMotionListener(this);
        private void setTransforms() {
            Insets insets = getInsets();
            xform = AffineTransform.getTranslateInstance(insets.left, insets.top);
            xform.scale(zoomFactor,zoomFactor);
            try {
                inverse = xform.createInverse();
            } catch (NoninvertibleTransformException e) {
                System.out.println(e);
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g;
            g2d.setRenderingHints(hints);
            g2d.drawRenderedImage(image, xform);
            if(!points.isEmpty()) {
                for(int i=0; i<points.size(); i++) {
                    if(i > 0)
                        drawLineSegment(g2d,points.get(i-1),points.get(i));
                    drawPoint(g2d, points.get(i));
            if(startingPoint != null) {
                drawTempLine(startingPoint, g2d);
            } else {
                mouseX = 0;
                mouseY = 0;
        private void drawPoint(Graphics2D g2d, Point2D p) {
            int x = (int)(p.getX() * zoomFactor);
            int y = (int)(p.getY() * zoomFactor);
            int w = (int)(13 * zoomFactor);
            int h = (int)(13 * zoomFactor);
            g2d.setColor(Color.ORANGE);
            g2d.setStroke(new BasicStroke(1.0F));
            g2d.fillOval(x - w / 2, y - h / 2, w, h);
            g2d.setColor(Color.BLACK);
            g2d.drawOval(x - w / 2, y - h / 2, w - 1, h - 1);
        private void drawLineSegment(Graphics2D g2d, Point2D p1, Point2D p2) {
            double x1 = p1.getX() * zoomFactor;
            double y1 = p1.getY() * zoomFactor;
            double x2 = p2.getX() * zoomFactor;
            double y2 = p2.getY() * zoomFactor;
            g2d.setColor(Color.RED);
            g2d.setStroke(new BasicStroke(3.0F));
            g2d.draw(new java.awt.geom.Line2D.Double(x1, y1, x2, y2));
        private void drawTempLine(Point2D p, Graphics2D g2d) {
            int startX = (int)(p.getX() * zoomFactor);
            int startY = (int)(p.getY() * zoomFactor);
            if(mouseX != 0 && mouseY != 0) {
                g2d.setColor(Color.RED);
                g2d.setStroke(new BasicStroke(2.0F));
                g2d.drawLine(startX, startY, mouseX, mouseY);
        public void mouseClicked(MouseEvent e) {}
        public void mouseDragged(MouseEvent e) {
            mouseX = (int)(e.getX()*zoomFactor);
            mouseY = (int)(e.getY()*zoomFactor);
            repaint();
        public void mousePressed(MouseEvent e) {
            if(e.getButton() == 1) {
                points.add(inverse.transform(e.getPoint(), null));
                if(points.size() > 0) {
                    startingPoint = points.get(points.size()-1);
                    mouseX = mouseY = 0;
            } else if(e.getButton() == 2) {
                zoomFactor = zoomFactor + .05;
                setTransforms();
            } else if(e.getButton() == 3) {
                zoomFactor = zoomFactor - .05;
                setTransforms();
            repaint();
        public void mouseReleased(MouseEvent e) {
            if(e.getButton() == 1) {
                points.add(inverse.transform(e.getPoint(), null));
            repaint();
        public void mouseEntered(MouseEvent mouseevent) {}
        public void mouseExited(MouseEvent mouseevent) {}
        public void mouseMoved(MouseEvent mouseevent) {}
    }

  • Memory Efficiency of BufferedImage and ImageIO

    This thread discusses the memory efficiency of BufferedImage and ImageIO. I also like to know whether if there's possible memory leak in BufferedImage / ImageIO, or just that the result matches the specifications. Any comments are welcomed.
    My project uses a servlet to create appropriate image tiles (in PNG format) that fits the specification of google map, from images stored in a database. But it only takes a few images to make the system out of heap memory. Increasing the initial heap memory just delays the problem. So it is not acceptable.
    To understand why that happens, I write a simple code to check the memory usage of BufferedImage and ImageIO. The code simply keeps making byte arrays from the same image until it is running out of the heap memory.
    Below shows how many byte arrays it can create:
    1M jpeg picture (2560*1920):
    jpeg = 123
    png = 3
    318K png picture (1000*900):
    jpeg = 1420
    png = 178
    Notice that the program runs out of memory with only 3 PNG byte arrays for the first picture!!!! Is this normal???
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import java.awt.geom.*;
    import javax.imageio.*;
    import java.io.*;
    import javax.swing.*;
    import java.util.*;
    public class Test {
         public static void main(String[] args) {
              Collection images = new ArrayList();
              for (;;) {
                   try {
                        BufferedImage img = ImageIO.read(new File("PTHNWIDE.png"));
                        img.flush();
                        ByteArrayOutputStream out =
                             new ByteArrayOutputStream();
                        ImageIO.write(img, "png", out); // change to "jpeg" for jpeg
                        images.add(out.toByteArray());
                        out.close();
                   } catch (OutOfMemoryError ome) {
                        System.err.println(images.size());
                        throw ome;
                   } catch (Exception exc) {
                        exc.printStackTrace();
                        System.err.println(images.size());
    }

    a_silent_lamb wrote:
    1. For the testing program, I just use the default VM setting, ie. 64M memory so it can run out faster. For server, the memory would be at least 256M.You might want to increase the heap size.
    2. Do you mean it's 2560*1920*24bits when loaded? Of course.
    That's pretty (too) large for my server usage, Well you have lots of image data
    because it will need to process large dimension pictures (splitting each into set of 256*256 images). Anyway to be more efficient?Sure, use less colors :)

  • Printing with BufferedImage and Text Quality

    I am using PrinterJob to print text/graphics.
    In my paint method, if we paint directly on the graphics handle using Graphics2D methods, the text quality is very good.
    Our application has to manage a lot of data, and to handle the callabcks for the same page, we are painting to a BufferedImage, and then drawing the BufferedImage unto the graphics handle on the subsequent calls. The overhead to draw the page is significant, and this give us much better performance.
    The PROBLEM IS, the quality of the text using the bufferedImage is like draft quality test, not the high resolution text we get when we paint directly on the supplied handle using the native drawing emthods every time.
    Any idea how we can buffer the page image, and retain the text quality ?
    In the paint we do:
    m_Image = ((Graphics2D)pg).getDeviceConfiguration().createCompatibleImage(m_wPage,m_hPage);
    m_Graphics = (Graphics2D) m_Image.getGraphics();

    Culd u share the fix if u found one

  • Write to bufferedimage and compatibleimages

    hey
    you maybe remember that I made a breakout game, i use compatibleimages in fullscreen and draw them alot of times..300+
    someone told me to use a bufferedImage and draw the image to this bufferedImage first then just blit the bufferedImage.
    is this correct?will that result in 1 blit instead of 300? and is if faster? the game has 70 fps now.

    hmm, the answer can be either yes or no.
    edit ESSAY ALERT :D
    if hardware acceleration is supported, your current way of doing it will be quicker.
    If hardware acceleration is not supported, reducing the number of blits may well increase speed.
    heres an outline of what the processes involve :-
    When hardware acceleration is supported
    A) Blitting each block seperately
    1) the framebuffer (back & front buffers) are both stored in vram.
    2) each blocks image is stored in main memory, and cached in vram.
    3) any blit operations are vram->vram, hence have near zero execution cost.
    B) Blitting each block to an intermediary image (when a change occurs), then blitting this intermediary image to the frame buffer.
    1) the frame buffer (back & front buffers) are both stored in vram.
    2) each blocks image is stored in main memory, and cached in vram. (though the vram cached version will never be used)
    3) the intermediary image is stored in main memory, and cached in vram.
    4) the regular blit operation will be
    intermediary image->frame buffer
    since both of these are in vram, the cost is near zero.
    5) when the intermediary image changes, the blit operation is
    blocks image->intermediary image
    since both these images have their original image stored in main memory,
    this blit is a main mem.->main mem. hence, will incur a speed cost.
    6) ALSO, when the intermediary image changes, the version cached in vram
    becomes invalid, and the image needs to be re-cached.
    This is a main mem.->vram copy, which also incurs a cost.
    If the intermediary image changes often, this will result in a drop in framerate each time a change occurs.
    (inconsistant framerates are VERY bad from a human perception POV)
    C) use a VolatileImage object for the intermediary image
    This is the best solution, as it removes all main mem->vram blits, and also reduces the vram->vram blits to an absolute minimum.
    However,
    the real speed difference between 300 vram blits
    and 1vram blit(+1 vram blit each time a change occurs)
    is absolutely minimal.
    (infact, because this isnt your bottleneck the speed difference will be zero)
    When hardware acceleration is NOT supported
    A) Blitting each block seperately
    1) the back buffer is in main mem. the front buffer is in vram.
    2) each blocks image is stored in main memory.
    3) each block blit is main mem.->main mem. (costly)
    PLUS the back buffer has to be blitted onto the front buffer, this is a main mem.->vram blit.
    B) Blitting each block to an intermediary image (when a change occurs), then blitting this intermediary image to the frame buffer.
    1) the back buffer is in main mem. the front buffer is in vram.
    2) each blocks image is stored in main memory.
    3) the intermediary image is stored in main mem.
    4) the regular blit operation will be
    intermediary image->back buffer
    this is a single main mem.->main mem. blit.
    5) also, each time the intermediary image changes,
    you will get an extra main mem->main mem blit.
    6) you also have the obligatory back buffer->front buffer blit
    Comparing the 2 methods when there is no hardware acceleration available
    you will see that the 2nd technique does indeed require fewer blits.
    (instead of 300 every frame, your doing 1+[1 each time a change occurs])
    So, now your left with the question, 'which do I use?'
    well, its totally down to whether you expect hardware acceleration to be available or not :S
    The ideal solution is to write 2 versions,
    not very 'Java', but its the way the world is :[                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • Copy BufferedImage and transparency

    In my applet, Toolkit.getImage() returns a BufferedImage of type TYPE_INT_ARGB, which I'm successfully using with transparency.
    However, running as an application, ImageIO.read() returns a BufferedImage of type TYPE_BYTE_BINARY, which doesn't support transparency.
    I've found that creating a new BufferedImage of type TYPE_INT_ARGB and copying into it doesn't work. The two types appear to be incompatible for copying.
    Any suggestions as to a "correct" way to read a GIF file in a java application and retain the transparency (mask) layer? I don't need blending, just a 1-bit stencil mask.
    Thanks,
    Chuck Bueche

    This is discussed alot on javagaming.org. But what you want to do is use Toolkit.getImage, in almost all cases it will be the best solution as it will hardware accelerate your image if it a) has no transparency or b) has 1 bit of transparency. If you have 255 levels of transparency in the image (most do for the nice smooth look) you will end up with an image that cannot be hardware accelerated (yet).
    ImageIO.read helps to make things easier to use/load, but right now none of the ImageIO functions produce hw acclerated images.

  • ImageIO, BufferedImage and PNG

    Hello,
    I have a BufferedImage object, and I would like to copied it to the clipboard as a PNG image. What I have now is a code that copy the BufferedImage to the clipboard.
    What's the best way to convert the BufferedImage to PNG? There is ImageIO.write() but I would prefer to not create a file on the disk for this task.
    Is it possible to create file in memory? or is it possible to convert the image in memory?
    Thanks in advance for your help.

    Thanks all for your answers.
    I found one possibility : an array of byte can be converted to an Image with a call to Toolkit.getDefaultToolkit().createImage()
    So the code looks like this:
    BufferedImage img = /* some code to get the img */;
    ByteArrayOutputStream byteoutarray = new ByteArrayOutputStream();
    ImageIO.write(img, "png", byteoutarray);
    PngSelection trans = new PngSelection(byteoutarray.toByteArray());
    Clipboard clipboard = getToolkit().getSystemClipboard();
    clipboard.setContents(trans, null);where PngSelection is defined like this:
    public static class PngSelection
       implements Transferable
       private byte[] data;
       public PngSelection(byte[] data) {
         this.data = data;
       public DataFlavor[] getTransferDataFlavors()
         return new DataFlavor[] {DataFlavor.imageFlavor};
       public boolean isDataFlavorSupported(DataFlavor flavor)
         return DataFlavor.imageFlavor.equals(flavor);
       public Object getTransferData(DataFlavor flavor)
         throws UnsupportedFlavorException,IOException
         if (!DataFlavor.imageFlavor.equals(flavor))
           throw new UnsupportedFlavorException(flavor);
         return Toolkit.getDefaultToolkit().createImage(data);
      }I need to test all this but it seems to works. Thanks again.

  • BufferedImages and Swing's ScrollablePicture in a JPanel

    I'm referring to http://java.sun.com/developer/technicalArticles/Media/imagestrategies/index.html paper.
    As I read this excellent paper, I decided to go for the BufferedImage strategy.
    But I can't put my BufferedImage into my ScrollablePicture as below:
    JPanel picPanel = new JPanel(new GridBagLayout());
    //Set up the scroll pane.
    picture = new ScrollablePicture(imageIcon_, columnView.getIncrement()); // OK
    //picture = new ScrollablePicture(bImg, columnView.getIncrement()); // NOT OK = don't work
    ...How to bypass the message "java:542: cannot resolve symbol symbol : constructor ScrollablePicture (java.awt.image.BufferedImage,int)"
    It is very important as all my code is based on BufferedImage to apply many operations on the image.
    ? I believe the API does not allow to perform RGB to B&W operation on ImageIcon. ?
    Thanks to all.
    dimitryous r.

    Hi camickr,
    Hi all,
    I pass trough my SSCCE. Good advice from camickr. But it was not so easy:
    Short: not so short
    Self contained: believe so
    Correct: Java 1.4.2 code
    Compilable: yes
    I'm back with formatted code.
    I'm sure you will fire at me all of you. Anyway if I don't even try, I will never succeed.
    //  TooAwoo.java
    //  TooAwoo
    //     part of this code is from Sun's JavaTutorial 1.4.2
    import java.applet.Applet.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.GraphicsEnvironment;
    import java.awt.image.*;
    import java.lang.*;
    import java.lang.String;
    import java.lang.Object;
    import java.net.URL;
    import java.net.MalformedURLException;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.event.MouseInputAdapter;
    import javax.swing.ImageIcon;
    import javax.swing.JScrollPane;
    import javax.swing.JToggleButton;
    import java.io.FilePermission;
    public class TooAwoo extends JApplet implements
                                                                ChangeListener,
                                                                ActionListener,
                                                                ItemListener
         FilePermission p = new FilePermission("<<ALL FILES>>", "read,write");
        public BufferedImage bImg;
         Font newFont = new Font("SansSerif", Font.PLAIN, 10);
         ImageControls RightPanel;
         public static int initOx = 0;
         public static int initOy = 0;
         int init_ww, init_wh, set_x, set_y = 0;
         final int pSP_w = 520; // final width of pictureScrollPane
         final int pSP_h = 650; // final height of pictureScrollPane
         Dimension applet_window; // applet dimensions
         public Image image;
         public ImageIcon imageIcon_;
         public static BufferedImage binull;
         // ScrollablePicture stuff
         public Rule columnView;
        public Rule rowView;
         public JToggleButton isMetric;
        public ScrollablePicture picture;
         public JScrollPane pictureScrollPane;
         public TooAwoo() {
              // nothing here
        public void init() {
              applet_window = getSize();                                                            // read applet dimensions in TooAwoo.html
              init_ww = applet_window.width;
              init_wh = applet_window.height;
              // get the image to use width > 680 (see final int pSP_w above)
              image = getImage(getDocumentBase(), "images/ReallyBig.jpg");
              imageIcon_ = createImageIcon("images/ReallyBig.jpg");
              int iw = imageIcon_.getIconWidth();
              int ih = imageIcon_.getIconHeight();
              bImg = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
              // Panels
              // ImageDisplayPanel
            //Create the row and column headers.
            columnView = new Rule(Rule.HORIZONTAL, true);
            rowView = new Rule(Rule.VERTICAL, true);
            if (imageIcon_ != null) {
                columnView.setPreferredWidth(imageIcon_.getIconWidth());
                rowView.setPreferredHeight(imageIcon_.getIconHeight());
            } else {
                columnView.setPreferredWidth(640);
                rowView.setPreferredHeight(480);
            //Create the upper left corner.
            JPanel buttonCorner = new JPanel();                                                  //use FlowLayout
            isMetric = new JToggleButton("cm", true);
            isMetric.setFont(newFont);
            isMetric.setMargin(new Insets(2,2,2,2));
            isMetric.addItemListener(this);                                                       // !!! not OK = don't work: button is not firing
            buttonCorner.add(isMetric);
              JPanel ImageDisplayPanel = new JPanel(new GridBagLayout());
            //Set up the scroll pane.
              picture = new ScrollablePicture(imageIcon_, columnView.getIncrement());     // either
              //picture = new ScrollablePicture(bImp, columnView.getIncrement());          // or
              // ********** if bImp change the lines in ScrollablePicture.java **********
            Graphics g = bImg.getGraphics();
              g.drawImage(bImg, 0, 0, null);
              JScrollPane pictureScrollPane = new JScrollPane(picture);
            pictureScrollPane.setPreferredSize(new Dimension(pSP_w, pSP_h));
            pictureScrollPane.setViewportBorder(
                    BorderFactory.createLineBorder(Color.black));
            pictureScrollPane.setColumnHeaderView(columnView);
            pictureScrollPane.setRowHeaderView(rowView);
              //Set the corners.
            pictureScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, buttonCorner);
            pictureScrollPane.setCorner(JScrollPane.LOWER_LEFT_CORNER,
                                        new Corner());
            pictureScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER,
                                        new Corner());
              //set_y++;
              addToGridBag(ImageDisplayPanel,pictureScrollPane, set_x, set_y, 1, 1, 0, 0); // 0,0
              getContentPane().add( BorderLayout.WEST, ImageDisplayPanel);               // where to display the bImg: left
              RightPanel = new ImageControls();                                                  // call the ImageControls class
              RightPanel.setBackground(Color.black);
              getContentPane().add( BorderLayout.EAST, RightPanel);
              //getContentPane().add( BorderLayout.EAST, ToolsPanel);                         // where to display the tools: right
              JPanel GlobalPanel = new JPanel(new GridBagLayout());
              getContentPane().add( BorderLayout.NORTH, GlobalPanel);
         } // end public void init()
         public Graphics2D createGraphics2D(int width,
                                                    int height,
                                                    BufferedImage bi,
                                                    Graphics g) {                                   // called by ImageControls paint
              Graphics2D g2 = null;
              if (bi != null) {
                   System.out.println("TooAwoo createGraphics2D: bi != null : " + " w= " + width + " h= " + height);
                   g2 = bi.createGraphics();
              } else {
                   System.out.println("TooAwoo createGraphics2D: bi == null g2 = (Graphics2D) g");
                   g2 = (Graphics2D) g;
              return g2; // return to ImageControls paint
         } // end createGraphics2D
         class ImageControls extends JPanel {
              public void paint(Graphics g) {
                   Dimension applet_window = getSize();
                   if (bImg == null) {
                        bImg = createBufferedImage(applet_window.width, applet_window.height, 2);
                   } else {
                        Graphics2D g2 = createGraphics2D(applet_window.width, applet_window.height, bImg, g);
                        g.drawImage( bImg , initOx , initOy , null );
                        g2.dispose();
                        //toolkit.sync();
                   } // end else (bImg != null)
              } // end paint
         } // end ImageControls
         public Dimension setPreferredSize() {
              Dimension applet_window = getSize();
              return applet_window;
         public String getString(String key) {
              return key;
         public BufferedImage createBufferedImage(int w, int h, int imgType) {          // called by ImageControls paint
              BufferedImage bi = null;
              if (imgType == 0) {
                   bi = (BufferedImage) getGraphicsConfiguration().createCompatibleImage(w, h);
              } else if (imgType > 0 && imgType < 14) {
                   bi = new BufferedImage(w, h, imgType);
              System.out.println("TooAwoo createBufferedImage: imgType= " + imgType + " w= " + w + " h= " + h);
              return bi;
         public static void addToGridBag(JPanel panel, Component comp,
                                                 int x, int y, int w, int h, double weightx, double weighty) {
              GridBagLayout gbl = (GridBagLayout) panel.getLayout();
              GridBagConstraints c = new GridBagConstraints();
              c.fill = GridBagConstraints.BOTH;
              c.anchor = GridBagConstraints.WEST;
              c.gridx = x;
              c.gridy = y;
              c.gridwidth = w;
              c.gridheight = h;
              c.weightx = weightx;
              c.weighty = weighty;
              panel.add(comp);
              gbl.setConstraints(comp, c);
         } // end addToGridBag
         protected static ImageIcon createImageIcon(String path) {                         // Returns an ImageIcon, or null if the path was invalid.
              java.net.URL imgURL = TooAwoo.class.getResource(path);
              if (imgURL != null) {
                   return new ImageIcon(imgURL);
              } else {
                   System.err.println("Couldn't find file: " + path);
                   return null;
         } // end createImageIcon
         private static void createAndShowGUI() {                                             // called by main
              JFrame frame = new JFrame("TooAwoo");                                             //Create and set up the window.
              // Make sure we have nice window decorations.
              frame.setDefaultLookAndFeelDecorated(true);
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              // Create and set up content pane.
              frame.addWindowListener(new WindowAdapter() {
                   public void windowClosing(WindowEvent e) {
                        System.exit(0);
              JPanel masterPanel = new JPanel();
              frame.add("Center", masterPanel);
              // Display the window.
              frame.pack();
              frame.setSize(new Dimension( 1000 , 640 ));
              frame.setVisible(true);
         } // end createAndShowGUI
         public static void main(String s[]) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                        createAndShowGUI();
         } // end main
         public void actionPerformed(ActionEvent e) {
              repaint(1024);
        public void stateChanged(ChangeEvent e) {
              repaint(1024);
         public void itemStateChanged(ItemEvent e) {
              Object obj = e.getSource();
              if ( obj == isMetric ) {
                   System.out.println("obj isMetric");
                //Turn it to metric.
                rowView.setIsMetric(true);
                columnView.setIsMetric(true);
                   picture.setMaxUnitIncrement(rowView.getIncrement());
            } else {
                System.out.println("obj isNotMetric");
                   //Turn it to inches.
                rowView.setIsMetric(false);
                columnView.setIsMetric(false);
                   picture.setMaxUnitIncrement(rowView.getIncrement());
         } // end itemStateChanged(ItemEvent e)
    } // end TooAwoo
    Next is ScrollablePicture.java
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import javax.swing.*;
    import javax.swing.border.*;
    public class ScrollablePicture extends JLabel implements Scrollable {
        private int maxUnitIncrement = 1;
         private boolean missingPicture = false;
        public ScrollablePicture (ImageIcon imageIcon_, int m){                              //(BufferedImage bImg, int m)
            super(imageIcon_); // comment this line if bImg...
              if (imageIcon_ == null) { // change imageIcon_ to bImg if bImg...
                   missingPicture = true;
                   setText("No picture found.");
                   setHorizontalAlignment(CENTER);
                   setOpaque(true);
                   setBackground(Color.black);
              maxUnitIncrement = m;
        public Dimension getPreferredScrollableViewportSize() {
            return getPreferredSize();
        public int getScrollableUnitIncrement(Rectangle visibleRect,
                                              int orientation,
                                              int direction) {
            //Get the current position.
            int currentPosition = 0;
            if (orientation == SwingConstants.HORIZONTAL)
                currentPosition = visibleRect.x;
            else
                currentPosition = visibleRect.y;
            //Return the number of pixels between currentPosition
            //and the nearest tick mark in the indicated direction.
            if (direction < 0) {
                int newPosition = currentPosition -
                   (currentPosition / maxUnitIncrement) *
                   maxUnitIncrement;
                return (newPosition == 0) ? maxUnitIncrement : newPosition;
            } else {
                return ((currentPosition / maxUnitIncrement) + 1) *
                   maxUnitIncrement - currentPosition;
        public int getScrollableBlockIncrement(Rectangle visibleRect,
                                               int orientation,
                                               int direction) {
            if (orientation == SwingConstants.HORIZONTAL)
                return visibleRect.width - maxUnitIncrement;
            else
                return visibleRect.height - maxUnitIncrement;
        public boolean getScrollableTracksViewportWidth() {
            return false;
        public boolean getScrollableTracksViewportHeight() {
            return false;
        public void setMaxUnitIncrement(int pixels) {
            maxUnitIncrement = pixels;
    Next is Corner.java
    import java.awt.*;
    import javax.swing.*;
    public class Corner extends JComponent {
        protected void paintComponent(Graphics g) {
            g.setColor(new Color(230, 163, 4));
            g.fillRect(0, 0, getWidth(), getHeight());
    Next is Rule.java
    import java.awt.*;
    import javax.swing.*;
    public class Rule extends JComponent {
        public static final int INCH = Toolkit.getDefaultToolkit().
                getScreenResolution();
        public static final int HORIZONTAL = 0;
        public static final int VERTICAL = 1;
        public static final int SIZE = 30;
        public int orientation;
        public boolean isMetric;
        private int increment;
        private int units;
        public Rule(int o, boolean m) {
            orientation = o;
            isMetric = m;
            setIncrementAndUnits();
        public void setIsMetric(boolean isMetric) {
            this.isMetric = isMetric;
            setIncrementAndUnits();
            repaint();
        private void setIncrementAndUnits() {
            if (isMetric) {
                units = (int)((double)INCH / (double)2.54); // dots per centimeter
                increment = units;
            } else {
                units = INCH;
                increment = units / 2;
        public boolean isMetric() {
            return this.isMetric;
        public int getIncrement() {
            return increment;
        public void setPreferredHeight(int ph) {
            setPreferredSize(new Dimension(SIZE, ph));
        public void setPreferredWidth(int pw) {
            setPreferredSize(new Dimension(pw, SIZE));
        protected void paintComponent(Graphics g) {
            Rectangle drawHere = g.getClipBounds();
            // Fill clipping area with dirty brown/orange.
            g.setColor(new Color(230, 163, 4));
            g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);
            // Do the ruler labels in a small font that's black.
            g.setFont(new Font("SansSerif", Font.PLAIN, 10));
            g.setColor(Color.black);
            // Some vars we need.
            int end = 0;
            int start = 0;
            int tickLength = 0;
            String text = null;
            // Use clipping bounds to calculate first and last tick locations.
            if (orientation == HORIZONTAL) {
                start = (drawHere.x / increment) * increment;
                end = (((drawHere.x + drawHere.width) / increment) + 1)
                      * increment;
            } else {
                start = (drawHere.y / increment) * increment;
                end = (((drawHere.y + drawHere.height) / increment) + 1)
                      * increment;
            // Make a special case of 0 to display the number
            // within the rule and draw a units label.
            if (start == 0) {
                text = Integer.toString(0) + (isMetric ? " cm" : " in");
                tickLength = 8;//10;
                if (orientation == HORIZONTAL) {
                    g.drawLine(0, SIZE-1, 0, SIZE-tickLength-1);
                    g.drawString(text, 2, 21);
                } else {
                    g.drawLine(SIZE-1, 0, SIZE-tickLength-1, 0);
                    g.drawString(text, 9, 10);
                text = null;
                start = increment;
            // ticks and labels
            for (int i = start; i < end; i += increment) {
                if (i % units == 0)  {
                    tickLength = 7;//10;
                    text = Integer.toString(i/units);
                } else {
                    tickLength = 4;//7;
                    text = null;
                if (tickLength != 0) {
                    if (orientation == HORIZONTAL) {
                        g.drawLine(i, SIZE-1, i, SIZE-tickLength-1);
                        if (text != null)
                            g.drawString(text, i-3, 21);
                    } else {
                        g.drawLine(SIZE-1, i, SIZE-tickLength-1, i);
                        if (text != null)
                            g.drawString(text, 9, i+3);
    Here is TooAwoo.html
    <HTML>
    <HEAD>
    <TITLE>TooAwoo</TITLE>
    </HEAD>
    <BODY>
    <APPLET archive="TooAwoo.jar" code="TooAwoo" width=1024 height=800>
    Your browser does not support Java, so nothing is displayed.
    </APPLET>
    </BODY>
    </HTML>
    */Total number of lines: 486
    Weight: 15 199 bytes
    Total number of files: 5
    TooAwoo.java
    ScrollablePicture.java
    Corner.java
    Rule.java
    TooAwoo.html
    ... in that order in my code
    The major default is: I cannot have that BuffuredImage at the left of the screen if run using bImp at line 91 of TooAwoo.java.
    Minor bug: the JToggle button (inch/cm) does not fires-up correctly. Nothing change.
    Anyway feel free to fire at me if you believe its a good strategy. I will remain very positive to all comments and suggestions.
    Thanks.
    dimitryous r.

  • Help with BufferedImage and JPanel

    I have a program that should display some curves, but thats not the problem, the real problem is when i copy the image contained in the JPanel to the buffered image then i draw something there and draw it back to the JPanel. My panel initialy its white but after the operation it gets gray
    Please if some one could help with this
    here is my code divided in three classes
    //class VentanaPrincipal
    package gui;
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JSeparator;
    import javax.swing.border.LineBorder;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    * This code was edited or generated using CloudGarden's Jigloo
    * SWT/Swing GUI Builder, which is free for non-commercial
    * use. If Jigloo is being used commercially (ie, by a corporation,
    * company or business for any purpose whatever) then you
    * should purchase a license for each developer using Jigloo.
    * Please visit www.cloudgarden.com for details.
    * Use of Jigloo implies acceptance of these licensing terms.
    * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
    * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
    * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
    public class VentanaPrincipal extends javax.swing.JFrame {
              //Set Look & Feel
              try {
                   javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
              } catch(Exception e) {
                   e.printStackTrace();
         private JMenuItem helpMenuItem;
         private JMenu jMenu5;
         private JMenuItem deleteMenuItem;
         private JSeparator jSeparator1;
         private JMenuItem pasteMenuItem;
         private JLabel jLabel4;
         private JLabel jLabel5;
         private JLabel jLabel3;
         private JLabel jLabel2;
         private JLabel jLabel1;
         private JButton jSPLineButton;
         private JButton jHermiteButton;
         private JButton jBezierButton;
         private JPanel jPanel2;
         private JPanel jPanel1;
         private JMenuItem jResetMenuItem1;
         private JMenuItem copyMenuItem;
         private JMenuItem cutMenuItem;
         private JMenu jMenu4;
         private JMenuItem exitMenuItem;
         private JSeparator jSeparator2;
         private JMenu jMenu3;
         private JMenuBar jMenuBar1;
          * Variables no autogeneradas
         private int botonSeleccionado;
         * Auto-generated main method to display this JFrame
         public static void main(String[] args) {
              VentanaPrincipal inst = new VentanaPrincipal();
              inst.setVisible(true);
         public VentanaPrincipal() {
              super();
              initGUI();
         private void initGUI() {
              try {
                        this.setTitle("Info3 TP 2");
                             jPanel1 = new pizarra();
                             getContentPane().add(jPanel1, BorderLayout.WEST);
                             jPanel1.setPreferredSize(new java.awt.Dimension(373, 340));
                             jPanel1.setMinimumSize(new java.awt.Dimension(10, 342));
                             jPanel1.setBackground(new java.awt.Color(0,0,255));
                             jPanel1.setBorder(BorderFactory.createCompoundBorder(
                                  new LineBorder(new java.awt.Color(0, 0, 0), 1, true),
                                  null));
                             BufferedImage bufimg = (BufferedImage)jPanel1.createImage(jPanel1.getWidth(), jPanel1.getHeight());
                             ((pizarra) jPanel1).setBufferedImage(bufimg);
                             jPanel2 = new JPanel();
                             getContentPane().add(jPanel2, BorderLayout.CENTER);
                             GridBagLayout jPanel2Layout = new GridBagLayout();
                             jPanel2Layout.rowWeights = new double[] {0.0, 0.0, 0.0, 0.0};
                             jPanel2Layout.rowHeights = new int[] {69, 74, 76, 71};
                             jPanel2Layout.columnWeights = new double[] {0.0, 0.0, 0.1};
                             jPanel2Layout.columnWidths = new int[] {83, 75, 7};
                             jPanel2.setLayout(jPanel2Layout);
                                  jBezierButton = new JButton();
                                  jPanel2.add(jBezierButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
                                  jBezierButton.setText("Bezier");
                                  jBezierButton.setFont(new java.awt.Font("Tahoma",0,10));
                                  jBezierButton.addActionListener(new ActionListener() {
                                       public void actionPerformed(ActionEvent evt) {
                                            bezierActionPerformed();
                                  jHermiteButton = new JButton();
                                  jPanel2.add(jHermiteButton, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
                                  jHermiteButton.setText("Hermite");
                                  jHermiteButton.setFont(new java.awt.Font("Tahoma",0,10));
                                  jSPLineButton = new JButton();
                                  jPanel2.add(jSPLineButton, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
                                  jSPLineButton.setText("SP Line");
                                  jSPLineButton.setFont(new java.awt.Font("Tahoma",0,10));
                                  jLabel1 = new JLabel();
                                  jPanel2.add(jLabel1, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
                                  jLabel1.setText("Posicion Mouse");
                                  jLabel2 = new JLabel();
                                  jPanel2.add(jLabel2, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.NONE, new Insets(12, 0, 0, 0), 0, 0));
                                  jLabel2.setText("X:");
                                  jLabel3 = new JLabel();
                                  jPanel2.add(jLabel3, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(0, 0, 12, 0), 0, 0));
                                  jLabel3.setText("Y:");
                                  jLabel4 = new JLabel();
                                  jPanel2.add(jLabel4, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.NONE, new Insets(12, 0, 0, 0), 0, 0));
                                  jLabel4.setText("-");
                                  jLabel5 = new JLabel();
                                  jPanel2.add(jLabel5, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0, GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(0, 0, 12, 0), 0, 0));
                                  jLabel5.setText("-");
                   this.setSize(600, 400);
                        jMenuBar1 = new JMenuBar();
                        setJMenuBar(jMenuBar1);
                             jMenu3 = new JMenu();
                             jMenuBar1.add(jMenu3);
                             jMenu3.setText("Archivo");
                                  jSeparator2 = new JSeparator();
                                  jMenu3.add(jSeparator2);
                                  exitMenuItem = new JMenuItem();
                                  jMenu3.add(exitMenuItem);
                                  exitMenuItem.setText("Exit");
                                  jResetMenuItem1 = new JMenuItem();
                                  jMenu3.add(jResetMenuItem1);
                                  jResetMenuItem1.setText("Reset");
                             jMenu4 = new JMenu();
                             jMenuBar1.add(jMenu4);
                             jMenu4.setText("Edit");
                                  cutMenuItem = new JMenuItem();
                                  jMenu4.add(cutMenuItem);
                                  cutMenuItem.setText("Cut");
                                  copyMenuItem = new JMenuItem();
                                  jMenu4.add(copyMenuItem);
                                  copyMenuItem.setText("Copy");
                                  pasteMenuItem = new JMenuItem();
                                  jMenu4.add(pasteMenuItem);
                                  pasteMenuItem.setText("Paste");
                                  jSeparator1 = new JSeparator();
                                  jMenu4.add(jSeparator1);
                                  deleteMenuItem = new JMenuItem();
                                  jMenu4.add(deleteMenuItem);
                                  deleteMenuItem.setText("Delete");
                             jMenu5 = new JMenu();
                             jMenuBar1.add(jMenu5);
                             jMenu5.setText("Help");
                                  helpMenuItem = new JMenuItem();
                                  jMenu5.add(helpMenuItem);
                                  helpMenuItem.setText("Help");
              } catch (Exception e) {
                   e.printStackTrace();
         private void bezierActionPerformed(){
              botonSeleccionado = 1;
              ((pizarra) jPanel1).setTipoFigura(botonSeleccionado);
              ((pizarra) jPanel1).pintarGrafico();
    //class graphUtils
    package func;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.image.BufferedImage;
    public class graphUtils {
         public static void dibujarPixel(BufferedImage img, int x, int y, int color){
              img.setRGB(x, y, color);
         public static void dibujarLinea(BufferedImage img, int x0, int y0, int x1, int y1, int color){
            int dx = x1 - x0;
            int dy = y1 - y0;
            if (Math.abs(dx) > Math.abs(dy)) {          // Pendiente m < 1
                float m = (float) dy / (float) dx;     
                float b = y0 - m*x0;
                if(dx < 0) dx = -1; else dx = 1;
                while (x0 != x1) {
                    x0 += dx;
                    dibujarPixel(img, x0, Math.round(m*x0 + b), color);
            } else
            if (dy != 0) {                              // Pendiente m >= 1
                float m = (float) dx / (float) dy;
                float b = x0 - m*y0;
                if(dy < 0) dy = -1; else dy = 1;
                while (y0 != y1) {
                    y0 += dy;
                    dibujarPixel(img, Math.round(m*y0 + b), y0, color);
         public static void dibujarBezier(BufferedImage img, Point puntos, int color){
    //class pizarra
    package gui;
    import javax.swing.*;
    import sun.awt.VerticalBagLayout;
    import sun.security.krb5.internal.bh;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import func.graphUtils;
    * esta clase pizarra extiende la clase JPanel y se agregan las funciones de pintado
    * y rellenado que se muestra en pantalla dentro del panel que se crea con esta clase
    * @author victorg
    public class pizarra extends JPanel implements MouseListener{
         private int tipoFigura;
         BufferedImage bufferImagen;
         Image img;
         Graphics img_gc;
         private Color colorRelleno, colorLinea;
         private Point puntosBezier[] = new Point[3];
         public pizarra(){
              super();          
              addMouseListener(this);
              //this.setBackground(Color.BLUE);
              colorLinea = Color.BLUE;
         public void setTipoFigura(int seleccion){
              // se setea para ver si es bezier, hermite, SP line
              tipoFigura = seleccion;
         public void setTipoRelleno(int seleccion){
         public void setColorRelleno(Color relleno){
              colorRelleno = relleno;          
         public void setColorLinea(Color linea){
              colorLinea = linea;
         public void setBufferedImage(BufferedImage bufimg){
              bufferImagen = bufimg;
         public void pintarGrafico(){
              Graphics g = this.getGraphics();     
              g.setColor(colorLinea);
              //accion ejecutada cuando se selecciona para graficar un poligono
              if(tipoFigura == 1){// bezier
                   if(bufferImagen == null){
                        //mantiene guardada la imagen cuando la pantalla pasa a segundo plano
                        bufferImagen = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
                        this.setBackground(Color.WHITE);                                                  
                        bufferImagen = (BufferedImage)createImage(getWidth(), getHeight());
                        //bufferImagen = this.createImage(getWidth(), getHeight());
                   //g.drawImage(bufferImagen,0,0,this);
                   graphUtils.dibujarLinea(bufferImagen,10, 10, 50, 50, colorLinea.getRGB());
                   g.drawImage(bufferImagen,0,0,this);
         protected void paintComponent(Graphics g) { // llamado al repintar
              //setBackground(colorFondo);
              super.paintComponent(g);
    //          Graphics2D g2 = (Graphics2D)g;          
    //          g2.drawImage(bufferImagen, 0,0, this);          
    //          g2.dispose();     
         public void mouseClicked(MouseEvent arg0) {          
         public void mousePressed(MouseEvent arg0) {
              // TODO Auto-generated method stub
         public void mouseReleased(MouseEvent arg0) {
              // TODO Auto-generated method stub
         public void mouseEntered(MouseEvent arg0) {
              // TODO Auto-generated method stub
         public void mouseExited(MouseEvent arg0) {
              // TODO Auto-generated method stub
    }

    1) Swing related questions should be posted in the Swing forum.
    Custom painting should be done in the paintComponent(..) method. You created a "pintarGraphico" method to do the custom painting, but that method is only execute once. When Java determines that the panel needs to be repainted, the paintComponent() method is executed which simply does a super.paintComponent(), which in turn simply paints the background of the panel overwriting you custom painting.

  • BufferedImage and .jpgs

    how can I make an animation of .jpg files using double buffer?
    My real problem is that I don't know how to load the images into a BufferedImage
    Thanks

    you might want to use the MemoryImageSource for the animation management. You'll have to read in the jpg using the decoder that sun provides and get the raw RGB data.
    If you don't want to do that, you can load up a jpg into an Image object by doing this:
    Image image = Toolkit.getDefaultToolkit().createImage("test.jpg");

  • BufferedImage and sockets

    How can i send a bufferedImage over a socket
    thnx

    you sure you really want to? I know you can do it because at the end of last semester we had a networked game project and some groups did things like that. I found it much more efficient though to sync up all the versions of the screen and just pass the changing data values back and forth. for example we passed a long at the start to initialize the game board and would pass values for moves along the network but never the actual graphics. But if you really want to pass graphics back and forth I cannot tell you how to do it but I can tell you it is definatly possible.

  • BufferedImage and palette

    Hello everybody,
    I'd like to animate a BufferedImage (currently TYPE_INT_ARGB) by only modifying something like a palette it would be based on.
    Can I do this, and how ???
    Thanks.

    Yep. RGBImageFilter. See a recent thread in the Java2D forum (or search that forum for RGBImageFilter pjt33 ).

  • BufferedImage and JTable

    I am trying to create a BufferedImage from a JTable so that I can convert it into a JPEG file, however,
    I can't get seem to get the graphics into the BufferedImage unless I first put the table into a JFrame and set
    it visible. Basically what I am doing is:
    JTable table = new JTable("with simple parameters");
    BufferedImage buf = new BufferedImage(table.getPrefferedSize.width,table.getPrefferedSize().height,TYPE_INT_RGB);
    Graphics g = buf.getGraphics();
    table.paint(g);
    I have tried paint, paintAll, createGraphics and many more - none of them have worked unless I first put the table into a container and then set the container visible. I can get a label and button to print out this way without having to first set them visible, but I can't do it with a JTable. Does anybody know a way to fix this??
    -Thanks for your help.

    Here is an example that saves a JTable as a JPEG image:
    import java.awt.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import java.awt.color.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import com.sun.image.codec.jpeg.*;
    public class SaveJTable {
        public static void saveComponentAsJPEG(Component cmp, Container cont, String jpegfile) {
           Rectangle d = cmp.getBounds();
           BufferedImage bi = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
           Graphics2D g2d = bi.createGraphics();
           SwingUtilities.paintComponent(g2d,cmp,cont, 0,0,d.width,d.height);
           saveImageAsJPEG(bi, jpegfile);
       public static void saveImageAsJPEG(BufferedImage bi, String filename) {
          try {
             ByteArrayOutputStream boutstream = new ByteArrayOutputStream();
             JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(boutstream);
             enc.encode(bi);
             FileOutputStream fimage = new FileOutputStream(new File(filename));
             boutstream.writeTo(fimage);
             fimage.close();
          } catch (Exception e) { System.out.println(e); }
       public static void  main(String[] args){
          SaveJTable comp = new SaveJTable();
          JButton jb = new JButton("my button");
          jb.setSize(100,50);
          JPanel jp = new JPanel();
          String data[][] = {{"a","b","c"},
                             {"e","f","g"},
                             {"h","i","j"},
                             {"k","l","m"}};
          String colnames[] = {"col1", "col2", "col3"};
          JTable jtb = new JTable(data, colnames);
          JFrame jf = new JFrame();
          JScrollPane jsp = new JScrollPane(jtb);
          jf.getContentPane().add(jsp);
          jf.pack();
          comp.saveComponentAsJPEG(jsp,jf.getContentPane(),"jtable.jpg");
          System.exit(0);
    }In the main() method, I created a sample JTable and put in in a JScrollPane. For some reason, the saved image doesn't show the column names if I don't put the JTable in a JScrollPane (no time to debug, sorry). So, I saved the JScrollPane instead of JTable.

  • BufferedImage and Socket

    does anyone know how to send a buffered image over a socket
    thnx

    You could set up an ObjectInputStream and ObjectOutputStream. I don't know how buffered images work, but if you could reduce them to a byte array, then reconstruct it, that would work too.

  • BufferedImage and Win2k

    guys,
    is it possible to port with my applet awt.image.BufferedImage?
    I've noticed that Win2k without SDK can't find BufferedImage, but I'd like that it can... is it possible to point it withoud configure system?
    Or maybe here is another thing?
    --dES                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    it forced me to configure the client machine. But what if I'd like to skip it? Is there analogue of BufferedImage?
    --dES                                                                                                                                                                                                                                                   

Maybe you are looking for

  • Applet won't repaint itself

    i have an applet that contains a jtexatrea 3 buttons and a jlabel. when i start it everuthing is just fine. however, my applet is supposed to open a file form the local filesystem (so it is signed) and after i click OK in the choose file dialog, my a

  • The error when "send questionnaire " in ROS Scenario

    Hi .My expert :    I work in SRM 7.0 ,ROS scenario .    when the vendor received the link "http://hostname.com:8000/sap/bc/bsp/sap/uws_form_service/page1.htm?uws_application=ROS_QUESTIONNAIRES&uws_mode=MAINTAIN&uws_refguid=DED3E7C0E226F8F1A9180024E85

  • LiveCycle 8.0 Error when dividing

    I am trying to divide two numeric fields using /. It returns the correct value, but gives a script error each time

  • Can i jump from 10.7.5 to 10.8.5

    Any harm in jumping from 10.7.5 to 10.8.5? I never updated to mountain lion but need to to use a new software but I don't want to go beyond what CS4 can support.

  • IPhone SDK: Setting Alarms?

    Hi, I'm writing an app for iPhones that requires: 1) Automatically launching itself at scheduled times 2) Setting 'alarms' in the system that would either do the above or show an alert of some sort at the given time However I can't find anything in t