2012-11-28 4 views
57

Там уже вопрос, как этот link на StackOverflow и принятый ответ «кастинг»:Java преобразования изображения в BufferedImage

Image image = ImageIO.read(new File(file)); 
BufferedImage buffered = (BufferedImage) image; 

В моей программе я стараюсь:

final float FACTOR = 4f; 
BufferedImage img = ImageIO.read(new File("graphic.png")); 
int scaleX = (int) (img.getWidth() * FACTOR); 
int scaleY = (int) (img.getHeight() * FACTOR); 
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH); 
BufferedImage buffered = (BufferedImage) image; 

Unfortunatelly Я получаю запустить временная ошибка:

sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage

Очевидно, что литье не работает.
Вопрос: Что (или есть) правильный способ преобразования изображения в BufferedImage?

+0

если вы хотите масштабировать изображение буферизованный, попробовать это попробовать это [http://stackoverflow.com/questions/4216123/ как в масштабе-а-BufferedImage] [1] [1]: http://stackoverflow.com/questions/4216123/how-to-scale-a-buffere dimage – user902383

+6

Для записи это не компилятор, который говорит это. Фактически вы видите ошибку времени выполнения ... не ошибку компиляции. –

+1

Вы правы. Спасибо за указание на это. Я отредактирую вопрос соответствующим образом. –

ответ

74

С Java Game Engine:

/** 
* Converts a given Image into a BufferedImage 
* 
* @param img The Image to be converted 
* @return The converted BufferedImage 
*/ 
public static BufferedImage toBufferedImage(Image img) 
{ 
    if (img instanceof BufferedImage) 
    { 
     return (BufferedImage) img; 
    } 

    // Create a buffered image with transparency 
    BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); 

    // Draw the image on to the buffered image 
    Graphics2D bGr = bimage.createGraphics(); 
    bGr.drawImage(img, 0, 0, null); 
    bGr.dispose(); 

    // Return the buffered image 
    return bimage; 
} 
+0

Действительно ли необходимо скопировать всю память изображений? –

+0

@ TomášZato Я думаю, что это единственный способ конвертировать из 'Image' в' BufferedImage'. Вы не должны беспокоиться о памяти при использовании Java. –

+4

@SriHarshaChilakapati 'Вы не должны беспокоиться о памяти при использовании Java. Судя по среднему потреблению памяти приложениями Java, другие разработчики определенно не беспокоятся о памяти немного. –

2

Если вы получаете обратно sun.awt.image.ToolkitImage, вы можете бросить изображение к этому, а затем использовать getBufferedImage(), чтобы получить BufferedImage.

Таким образом, вместо последней строки кода, где вы бросаете вы бы просто сделать:

BufferedImage buffered = ((ToolkitImage) image).getBufferedImage(); 
+4

не работает для OpenJDK – AvrDragon

+4

1) Он не согласен использовать классы из пакета 'sun'. Они не гарантированно доступны в не-Oracle JDK. 2) Метод 'getBufferedImage()' работает только в том случае, если буферизованное изображение было создано внутренне с помощью 'TookitImage'. Чаще всего (99%) это не так, поэтому возвращаемое значение равно «null». [Источник ссылки] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/image/ToolkitImage.java#ToolkitImage.getBufferedImage%28%29) – kevinarpe

16

Один из способов справиться с этим, чтобы создать новый BufferedImage, и сказать, что это графический объект, чтобы привлечь ваше масштабируется изображение в новый BufferedImage:

final float FACTOR = 4f; 
BufferedImage img = ImageIO.read(new File("graphic.png")); 
int scaleX = (int) (img.getWidth() * FACTOR); 
int scaleY = (int) (img.getHeight() * FACTOR); 
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH); 
BufferedImage buffered = new BufferedImage(scaleX, scaleY, TYPE); 
buffered.getGraphics().drawImage(image, 0, 0 , null); 

Это должно делать трюк без литья.

+1

Никогда не забывайте удалять созданные графические экземпляры –

+0

Как «создавать созданные графические интерфейсы»? – Buffalo

+2

вы добавляете buffered.getGraphics(). Dispose(); к коду. – salbeira

1

Если вы используете Kotlin, вы можете добавить метод расширения к изображению таким же образом, как предлагает Шри Харша Чилакапати.

fun Image.toBufferedImage(): BufferedImage { 
    if (this is BufferedImage) { 
     return this 
    } 
    val bufferedImage = BufferedImage(this.getWidth(null), this.getHeight(null), BufferedImage.TYPE_INT_ARGB) 

    val graphics2D = bufferedImage.createGraphics() 
    graphics2D.drawImage(this, 0, 0, null) 
    graphics2D.dispose() 

    return bufferedImage 
} 

И использовать его как это:

myImage.toBufferedImage() 
Смежные вопросы