hi all,
i ve been trying to scale an image using java. The program runs well, however i found that the quality of the new image is not good, many rectangles appear in the image, especially when the dimensions of the new image are small (around 72 x 72 pixels).
This is my code:
can you suggest any better way to scale the image? ThanksCode:public static void main(String[] args) { // TODO Auto-generated method stub BufferedImage bsrc; try { bsrc = ImageIO.read(new File("/home/bubuzzz/Tools/Icon/ksirc.png")); Image desc = bsrc.getScaledInstance(72, -1, Image.SCALE_SMOOTH); BufferedImage bdest = toBufferedImage(desc); ImageIO.write(bdest,"PNG",new File("/home/bubuzzz/Desktop/ksirc.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage)image; } // This code ensures that all the pixels in the image are loaded image = new ImageIcon(image).getImage(); // Determine if the image has transparent pixels; for this method's // implementation, see e661 Determining If an Image Has Transparent Pixels boolean hasAlpha = hasAlpha(image); // Create a buffered image with a format that's compatible with the screen BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { // Determine the type of transparency of the new buffered image int transparency = Transparency.OPAQUE; if (hasAlpha) { transparency = Transparency.BITMASK; } // Create the buffered image GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); bimage = gc.createCompatibleImage( image.getWidth(null), image.getHeight(null), transparency); } catch (HeadlessException e) { // The system does not have a screen } if (bimage == null) { // Create a buffered image using the default color model int type = BufferedImage.TYPE_INT_RGB; if (hasAlpha) { type = BufferedImage.TYPE_INT_ARGB; } bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); } // Copy image to buffered image Graphics g = bimage.createGraphics(); // Paint the image onto the buffered image g.drawImage(image, 0, 0, null); g.dispose(); return bimage; } public static boolean hasAlpha(Image image) { // If buffered image, the color model is readily available if (image instanceof BufferedImage) { BufferedImage bimage = (BufferedImage)image; return bimage.getColorModel().hasAlpha(); } // Use a pixel grabber to retrieve the image's color model; // grabbing a single pixel is usually sufficient PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); try { pg.grabPixels(); } catch (InterruptedException e) { } // Get the image's color model ColorModel cm = pg.getColorModel(); return cm.hasAlpha(); }
You have to blur the image before resizing:
see this page: componenthouse.com/article-20
Here is a Visual basic function that allow you to scale a image
also you can see from the example that at 300% increase there is little pixelation, if you use a blur function after you should not see any pixelation
ess-image.com/Graphic/Image_Processing/ZoomImage.aspx
I hope this helps you
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks