• 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.