[英]Getting Height and Width of Image in Java without an ImageObserver
[英]Is there any way in Java to take image width and height without transfer or download?
為了獲得圖像的高度,我們可以使用ImageIO.read(new URL("…")).getHeight()
。
我的問題:
首先,你的問題:
的種類。 首先, ImageIO.read(...)
方法是方便的方法,它將解碼文件中的第一個圖像,使用所有默認參數進行解碼。 由於所有ImageIO.read(...)
操作都被委托給格式化特定插件或ImageReader
實例(如JPEGImageReader
),因此這可能是特定於插件的。 但一般情況是,圖像數據是“在運行中”傳輸和解碼的。 請注意,這里沒有“大小計算”,而是在這種情況下整個圖像被解碼為BufferedImage
。 除了解碼的像素值之外,必須傳送解碼文件中的第一圖像所需的數據,但不必存儲在計算機上的任何地方。
這取決於。 有一個設置ImageIO.setUseCache(boolean)
,它控制數據是緩存在磁盤上還是緩存在RAM中。
true
,則數據臨時存儲在磁盤上,通常位於默認臨時目錄中(請參閱java.io.tempdir
系統屬性)。 false
,則在解碼圖像時將數據臨時存儲在存儲器中。 不,除非您的服務器有一個特殊的API來為您提供此數據,並且您針對此API執行特定請求。 但是, ImageIO
API確實有更多粒度方法,可以讓您更快地獲得圖像尺寸,而無需預先下載/解碼整個圖像。
獲得圖像尺寸的更快方法是:
try (InputStream stream = url.openStream()) {
// The "useCache" setting will decide whether "input" below
// will be disk or memory cached
try (ImageInputStream input = ImageIO.createImageInputStream(stream)) {
ImageReader reader = ImageIO.getImageReaders(input).next(); // TODO: Handle no reader
try {
reader.setInput(input);
// Get dimensions of first image in the stream, without decoding pixel values
int width = reader.getWidth(0);
int height = reader.getHeight(0);
}
finally {
reader.dispose();
}
}
}
同樣,根據圖像格式,上述代碼應該只讀取確定圖像尺寸所需的標題/元數據。 大多數ImageReader
實現都會為此讀取所有標頭數據,但是,它仍然比解碼整個圖像要快得多,並且涉及的數據(和內存)要少得多。
由於不同的格式具有不同大小的標題,底層傳輸(即HTTP)可能以“塊”等方式傳輸數據,因此很難對下載多少數據或需要下載多少數據做出任何假設。
答案是read()
方法必須完成並返回一個值,因為可以調用getHeight()
方法。
這甚至不是ImageIO
問題,它只是基本的Java語法和語義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.