2010-04-30 25 views
8

Bu benim sahip olduğum kod, aslında işe yarar, mükemmel değil ama sorun, yeniden boyutlandırılan minik resimlerin beyaz üzerine çizilmemesi sorunudur. görüntü en boy oranını kırma, burada kod, birisi bana bunun için bir düzeltme önerebilir, lütfen? Eğer elde ettikten sonraJava: Resim formatını algılamak, yeniden boyutlandırmak (ölçeklemek) ve JPEG olarak kaydetme

BufferedImage img = ImageIO.read(new File("image.jpg")); 
int scaleX = (int) (img.getWidth() * 0.5); 
int scaleY = (int) (img.getHeight() * 0.5); 

Image newImg = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH); 

senin Image ölçekli içine geri 'dönüştürmek' olabilir:

Eğer

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.imageio.ImageIO; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class ImageScalerImageIoImpl implements ImageScaler { 

private static final String OUTPUT_FORMAT_ID = "jpeg"; 

// Re-scaling image 
public byte[] scaleImage(byte[] originalImage, int targetWidth, 
    int targetHeight) { 

    try { 
    InputStream imageStream = new BufferedInputStream(
    new ByteArrayInputStream(originalImage)); 
    Image image = (Image) ImageIO.read(imageStream); 

    int thumbWidth = targetWidth; 
    int thumbHeight = targetHeight; 

    // Make sure the aspect ratio is maintained, so the image is not skewed 
     double thumbRatio = (double)thumbWidth/(double)thumbHeight; 
     int imageWidth = image.getWidth(null); 
     int imageHeight = image.getHeight(null); 
     double imageRatio = (double)imageWidth/(double)imageHeight; 
     if (thumbRatio < imageRatio) { 
      thumbHeight = (int)(thumbWidth/imageRatio); 
     } else { 
      thumbWidth = (int)(thumbHeight * imageRatio); 
     } 

    // Draw the scaled image 
    BufferedImage thumbImage = new BufferedImage(thumbWidth, 
    thumbHeight, BufferedImage.TYPE_INT_RGB); 
    System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight); 

    Graphics2D graphics2D = thumbImage.createGraphics(); 
    // Use of BILNEAR filtering to enable smooth scaling 
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
    RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    // graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null); 

    // White Background 
    graphics2D.setPaint(Color.WHITE); 
    graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth, 
    targetHeight)); 
    graphics2D.fillRect(0, 0, targetWidth, targetHeight); 

    System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight); 

    // insert the resized thumbnail between X and Y of the image 
    graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null); 

    System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight); 

    // Write the scaled image to the outputstream 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out); 
    return out.toByteArray(); 

    } catch (IOException ioe) { 
    throw new ImageResizingException(ioe); 
    } 
} 

} 

cevap

9

Kolayca Image 'ın getScaledInstance yöntemi kullanarak resminizi ölçeklendirebilirsiniz ederiz here'da açıklandığı gibi bir BufferedImage.

Son olarak, BufferedImage dosyanızı bir dosyaya yazmak için ImageIO sınıfını kullanın.

+0

Ölçekleme, hedef Canvas konteynerine bağlı olarak dinamik olmalıdır. Her neyse, kendimi iyi bir refakatçi ve birkaç mantık düzeltmesiyle çözdüm. Yine de teşekkürler – BoDiE2003

+0

bağlantı çalışmıyor. Image BufferedImage dönüşümü için ipuçları? – Karussell

+0

Hangi bağlantı çalışmıyor? Hepsini denedim ve iyi görünüyorlar. – Adamski