• 0

[JAVA] Getting TIFF image dimension without loading image


Question

Hi Guys,

Hope someone can help me here.

I need to find the dimension of a REALLY BIG TIFF Image (It is a GEOTIFF MAP). I've tried using JAI or ImageIO but it resulted in mem overflow and some ARRAY SIZE LIMIT exception. But I don't really want to LOAD the entire TIFF. I just only want the dimension (Height and Width) of it.

I did my own research and the only piece of code i found that works is the following:

  Quote
ImageInputStream imageStream = ImageIO.createImageInputStream(inputTIF);

java.util.Iterator<ImageReadereaders = ImageIO.getImageReaders(imageStream);

ImageReader reader = null;

if(readers.hasNext()) {

reader = readers.next();

}else {

imageStream.close();

//can't read image format... what do you want to do about it,

//throw an exception, return ?

}

reader.setInput(imageStream,true,true);

int imageWidth = reader.getWidth(0);

int imageHeight = reader.getHeight(0);

reader.dispose();

imageStream.close();

Ok, here comes my problem. ImageReader is only available in Java 1.5 and above. UNFORTUNATELY... i am limited (means i cannot change this) to only using java 1.4.2_05. So i don't have ImageReader. So my question is if there is any other way i can read the image dimension?

Regards

Don Chen

3 answers to this question

Recommended Posts

  • 0

The Python Imaging Library does exactly what you want, that is, opening an image file doesn't load it in memory, and you can retrieve its width and height without loading it. It's also completely trivial:

import Image
myImage = Image.open("M:\yImage\P.athmensions = myImage.size
print "width =" +  dimensions[0]
print "height =" + dimensions[1]

I don't know if that's an option for you given that you're currently working in Java; maybe you can compile it to an executable and have Java call that and pipe the output toward itself, or use some temporary file.

  • 0

Because I am totally awesome, I wrote the python script and compiled it to an exe so you can invoke it from your java code (using Runtime.exec). It outputs width and height into a text file bearing the same name as the image file + the word "_Dimensions" (and it ends with ".txt" of course). So invoke the process, open the output file for reading, and read the data.

It's not fast, but it's way faster than loading the image in memory.

Here's the script in case you're interested. The exe is attached to this post. Unzip the whole thing because the dll and other files are needed for the exe to run.

import Image
import sys
import os

def main():
	if not areValid(sys.argv):
		printHelp()
		return
	try:
		filename = sys.argv[1]
		image = Image.open(filename)
		dimensions = image.size
	except Exception, e:
		print "Error trying to read " + filename + ":"
		print e

	try:
		parts = filename.split('\\')
		newName = parts[len(parts) - 1]
		parts = newName.split('/')
		newName = parts[len(parts) - 1]
		parts = newName.split('.')
		txtFileName = parts[0] + "_Dimensions.txt"
		txtFile = open(txtFileName, 'w')
		strDimensions = [str(i) + '\n' for i in dimensions]
		txtFile.writelines(strDimensions)
		txtFile.close()
	except Exception, e:
		print "Error trying to save dimensions:"
		print e


def areValid(argv):
	if not len(argv) &gt;= 2:
		return False
	if not os.path.isfile(argv[1]):
		return False
	return True

def printHelp():
	print "usage : getImageSize.exe C:\Path\To\MyImage.tif"
	print "the results will be output to MyImage_Dimensions.txt"
	print "this  text file will contain two numbers in ASCII:, first the width, then the height of the image."


if __name__ == "__main__":
	main()

dist.zipFetching info...

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • AMD RX 9060 XT launches above MSRP and is available to buy now by Sayan Sen At Computex 2025 this year, AMD announced its RX 9060 XT mid-range desktop GPUs. The new graphics card landed in both 8GB and 16GB flavors and targets 1080p as well as light 1440p gaming. The community and some of the media criticized the 8GB VRAM model, but AMD defended the move explaining how the smaller memory buffer is not a cause of worry for the majority. Both the 8 GB and the 16 GB RX 9060 XT are now available for purchase. A new driver is out too with Adrenalin version 25.6.1. However, as always, day one stocks would likely be highly limited, similar to other GPUs or any other product, like the Nintendo Switch 2, that also landed today. Third-party AIB (add in board) vendors like Gigabyte, for example, are selling the 8GB at $329 (SEP is $299) currently on Amazon US, so expect some markup. The technical specifications of the Radeon RX 9060 XT are given below: Specification Value GPU Architecture AMD RDNA™ 4 Core Compute Units 32 Video Memory 16 GB / 8GB GDDR6 Infinity Cache 32 MB Core Boost Clock Up to 3.13 GHz Memory speed/bandwidth 20 Gbps / 320 GB/s AI Performance 821 TOPS (INT4 with sparsity) Raytracing & AI Accelerators 32 3rd Generation Raytracing Accelerators; 64 2nd Generation AI Accelerators PCIe Interface PCIe® 5.0 x16 Display Outputs DisplayPort™ 2.1a, HDMI® 2.1b Total Board Power (TBP) 160W* If you notice, we have an asterisk for the TBP value in the table above. That is because AMD says that it can vary between 150 and 182 watts. Performance-wise, we know the $349 16 GB variant is close to the Nvidia RTX 5060 Ti in rasterization but falls behind in ray tracing. Meanwhile, the 8GB model, priced the same as the GeForce RTX 5060 at $299, should be better, as both 8 Gig and 16 Gig SKUs are identical spec-wise outside of memory capacity. As an Amazon Associate we earn from qualifying purchases.
    • It actually looks decent, although trailers could make the worst nonsense look watchable sometimes. I'm not a fan of the "extended" Aliens universe (Prometheus, Covenant), but I liked Romulus so will definitely give this a shot.
    • I just don't think it's possible for a government to be 100% state-owned in its companies. Every government depends on private technologies to function. There are very smart technology teams at Google, Microsoft, Intel, AMD, Nvidia, IBM, Apple, Amazon. What the US government wants are these people working together.
    • I agree with keeping defense contractors local, but... The goal proposed here isn't to cut spending (though I think that is also a worthy goal), the goal is to ensure spending is being properly accounted for. I'm not sure why working with US based companies would make proper accounting more difficult than going international. I assume the point you are making is that after several rounds of audit failures and cuts, they would be forced to look for cheaper venders, but again, PASS THE F***ING AUDIT, then the cuts don't happen. Everyone was losing their minds when some of the Covid PPP money was misused, and yes, that was bad, but the DoD misplaces many times that amount of money every year, and no one seems to care. It is totally unacceptable for the 2nd biggest government expenditure to be an unaccountable black box.
    • I don't know man.. when I go incognito and I fill in an amount and click on Donate with Debit or credit card, it takes me to a page where I can choose the country and bank/credit card details to fill in. It does not require a PayPal account. No biggie either way.
  • Recent Achievements

    • Week One Done
      jbatch earned a badge
      Week One Done
    • First Post
      Yianis earned a badge
      First Post
    • Rookie
      GTRoberts went up a rank
      Rookie
    • First Post
      James courage Tabla earned a badge
      First Post
    • Reacting Well
      James courage Tabla earned a badge
      Reacting Well
  • Popular Contributors

    1. 1
      +primortal
      406
    2. 2
      +FloatingFatMan
      181
    3. 3
      snowy owl
      175
    4. 4
      ATLien_0
      170
    5. 5
      Xenon
      135
  • Tell a friend

    Love Neowin? Tell a friend!