[英]How to obtain a resized BufferedImage
假設我有2個TIF
圖像,並將其中一個讀入BufferedImage
實例:
ImageReader reader = ImageIO.getImageReadersByFormatName("tif").next();
reader.setInput(inputStream, false); // inputStream is the first image.
BufferedImage bufferedImage = reader.read(0);
現在,我想創建一個新的BufferedImage
而不讀取其他圖像 。 它應該與前一個相同,但大小不同。 對於TIF
圖像, imageType
似乎為0,但以下操作無效。
BufferedImage largeBufferedImage = new BufferedImage(newWidth, newHeight, 0);
有什么方法可以克隆現有的BufferedImage
並僅更改其大小?
順便說一句,我希望能夠對任何圖像格式進行處理。 如果可能的話,我不想處理諸如imageType
細節。
BufferedImage deepCopy(BufferedImage bi)/*method to clone BufferedImage*/ {
ColorModel cm = bi.getColorModel();
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
WritableRaster raster = bi.copyData(null);
return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}
BufferedImage newImg = deepCopy(oldImg);//clone it
Graphics2D g = newImg.createGraphics();
g.drawImage(newImg, 0, 0, width, height, null);//newImg will be resized
當您繪制paint
方法時,可以添加更多參數來拉伸和縮放圖像,請參閱此鏈接處的g.drawImage
。
經過一番嘗試和錯誤之后,我找到了解決問題的可行方案。
private BufferedImage copyAndResize(BufferedImage source, int width, int height)
{
ColorModel cm = source.getColorModel();
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
WritableRaster raster = source.copyData(null);
SampleModel sm = raster.getSampleModel().createCompatibleSampleModel(width, height);
WritableRaster newRaster = WritableRaster.createWritableRaster(sm, null);
BufferedImage newBi = new BufferedImage(cm, newRaster, isAlphaPremultiplied, null);
return newBi;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.