• 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

    • So, they catched 2-3 of the bad guys. The other 30.000 went undetected.
    • Borderlands 2 is free on Steam to grab right now by Pulasthi Ariyasinghe The fourth installment in the main Borderlands series is only a few months away from launch, and now there's a good opportunity for new players to see what all the excitement is about. Developer Gearbox today launched a giveaway for Borderlands 2, offering the base game for all PC gamers to claim for free and play through its campaign. The promotion is running on Steam, making it an easy grab for most. The 2012-released action RPG takes players to the lawless planet of Pandora for a humorous adventure concerning a rebel group going up against the fan-favorite tyrannical boss, Handsome Jack. Taking the role of Vault Hunters searching for a grand treasure on the planet, the characters Axton (Commando), Maya (Siren), Zer0 (Assassin), and Salvador (Gunzerker) are available to play in the base game. Each Vault Hunter has their own skill trees and ultimate abilities, letting players mix and match many of their play styles when progressing through the campaign. However, perhaps the most important aspect of the Borderlands series is the guns. The looter shooter elements of the title mean that there are countless weapon and gear variations, each coming with unique stats and effects that vary depending on the rarity. Borderlands 2 supports up to 4-player cooperative play with drop-in, drop-out multiplayer. Your character's loadout and progression will follow you for any games you join as well. The Borderlands 2 giveaway on Steam is live right now. It's slated to come to an end on June 8 at 10am PT. For those looking to expand on the Borderlands universe after grabbing the freebie, all the games and their massive number of DLCs are discounted as part of a franchise sale on Steam right now too. Don't forget that PC players can also pick up Bethesda's Deathloop right now for free as well, with that promotion currently running on the Epic Games Store.
    • They need to pay me more than that!
    • Yep, same. One less source of brainrot to boot.
  • Recent Achievements

    • First Post
      Uranus_enjoyer earned a badge
      First Post
    • Week One Done
      Uranus_enjoyer earned a badge
      Week One Done
    • Week One Done
      jfam earned a badge
      Week One Done
    • First Post
      survivor303 earned a badge
      First Post
    • Week One Done
      CHUNWEI earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      428
    2. 2
      +FloatingFatMan
      199
    3. 3
      snowy owl
      192
    4. 4
      ATLien_0
      187
    5. 5
      Xenon
      142
  • Tell a friend

    Love Neowin? Tell a friend!