簡體   English   中英

在沒有傳輸或下載的情況下,Java中是否有任何方法可以獲取圖像寬度和高度?

[英]Is there any way in Java to take image width and height without transfer or download?

為了獲得圖像的高度,我們可以使用ImageIO.read(new URL("…")).getHeight()

我的問題:

  1. 我是否正確理解此方法在計算大小之前將圖像下載到本地計算機?
  2. 如果是,請將映像下載到哪個位置 - 到HDD上的某些JVM緩存或直接到RAM?
  3. 有沒有辦法在沒有傳輸或下載的情況下拍攝圖像的高度? 但是對服務器有某種要求?

首先,你的問題:

  1. 的種類。 首先, ImageIO.read(...)方法是方便的方法,它將解碼文件中的第一個圖像,使用所有默認參數進行解碼。 由於所有ImageIO.read(...)操作都被委托給格式化特定插件或ImageReader實例(如JPEGImageReader ),因此這可能是特定於插件的。 但一般情況是,圖像數據是“在運行中”傳輸和解碼的。 請注意,這里沒有“大小計算”,而是在這種情況下整個圖像被解碼為BufferedImage 除了解碼的像素值之外,必須傳送解碼文件中的第一圖像所需的數據,但不必存儲在計算機上的任何地方。

  2. 這取決於。 有一個設置ImageIO.setUseCache(boolean) ,它控制數據是緩存在磁盤上還是緩存在RAM中。

    • 如果設置為true ,則數據臨時存儲在磁盤上,通常位於默認臨時目錄中(請參閱java.io.tempdir系統屬性)。
    • 如果設置為false ,則在解碼圖像時將數據臨時存儲在存儲器中。
  3. 不,除非您的服務器有一個特殊的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM