Java: PNGException: Premature End of JPEG File

  • Context: Java 
  • Thread starter Thread starter haxor489
  • Start date Start date
  • Tags Tags
    Java
Click For Summary
SUMMARY

The discussion centers around the error "PNGException: crc corruption" encountered while attempting to retrieve and display an image from a URL using Java's AWT Toolkit. The user initially attempts to read the image data into a byte array based on the content length, which leads to incomplete data being processed, resulting in a corrupted image. A solution is proposed to simplify the image retrieval process by directly using the URL in the Toolkit's createImage method, which effectively resolves the issue of incomplete data reads.

PREREQUISITES
  • Java AWT Toolkit for image handling
  • Understanding of InputStream and BufferedInputStream classes
  • Knowledge of URLConnection for network connections
  • Familiarity with exception handling in Java
NEXT STEPS
  • Learn about Java's InputStream and how to read data efficiently
  • Explore the AWT Toolkit's image handling capabilities
  • Investigate the use of URL and URLConnection for network operations in Java
  • Study best practices for handling image formats and error checking in Java applications
USEFUL FOR

Java developers, software engineers working with image processing, and anyone troubleshooting image retrieval issues in Java applications.

haxor489
Messages
25
Reaction score
0
I'm getting this error

sun.awt.image.PNGImageDecoder$PNGException: crc corruption
at sun.awt.image.PNGImageDecoder.getChunk(Unknown Source)
at sun.awt.image.PNGImageDecoder.getData(Unknown Source)
at sun.awt.image.PNGFilterInputStream.read(Unknown Source)
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.awt.image.PNGImageDecoder.produceImage(Unknown Source)
at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
at sun.awt.image.ImageFetcher.run(Unknown Source)
This is the segment of code causing the error.

Code:
URLConnection con = new URL("www.example.com").openConnection();
		InputStream is = con.getInputStream();
		byte bytes[] = new byte[con.getContentLength()];
		
		BufferedInputStream bis = new BufferedInputStream(is);
		bis.read(bytes);
		bis.close();
		con.getInputStream().close();
		
		Toolkit tk = getToolkit();
		
		image.setImage(tk.createImage(bytes));
		File save = new File("picture");
		FileOutputStream fos =  new FileOutputStream(save);
		
		fos.write(bytes);
		fos.close();
		if(tk.prepareImage(image.getImage(), 900, 900, null)){
			System.out.println("True");
		}else
			System.out.println("False");

The file i output to shows that the image is corrupt, only a few lines of the image are visible and the rest is black. tk.prepareImage() also returns false. This segment sits in a method called once in its class's constructor method. I'm contacting the maps.google server for a map image with the proper parameters. The image returns fine with the same url in a browser . I've checked the google maps API documentation but nothing stands out. Any ideas?Edit: Attempted requesting a different image format, but now i get "Premature end of JPEG file"
 
Last edited:
Technology news on Phys.org
haxor489 said:
This is the segment of code causing the error.

Code:
URLConnection con = new URL("www.example.com").openConnection();
		InputStream is = con.getInputStream();
		byte bytes[] = new byte[con.getContentLength()];
		
		BufferedInputStream bis = new BufferedInputStream(is);
		bis.read(bytes);
		bis.close();
		con.getInputStream().close();
		
		Toolkit tk = getToolkit();
		
		image.setImage(tk.createImage(bytes));
		File save = new File("picture");
		FileOutputStream fos =  new FileOutputStream(save);
		
		fos.write(bytes);
		fos.close();
		if(tk.prepareImage(image.getImage(), 900, 900, null)){
			System.out.println("True");
		}else
			System.out.println("False");

The file i output to shows that the image is corrupt, only a few lines of the image are visible and the rest is black. tk.prepareImage() also returns false. This segment sits in a method called once in its class's constructor method. I'm contacting the maps.google server for a map image with the proper parameters. The image returns fine with the same url in a browser . I've checked the google maps API documentation but nothing stands out. Any ideas?Edit: Attempted requesting a different image format, but now i get "Premature end of JPEG file"

This seems like a really convoluted way to grab an image from a URL. If the URL contains nothing but the image, why not just use something like
Code:
try {
    Image image = tk.createImage(new URL("www.example.com"));
} catch (//whatever exceptions URL's constructor & ToolKit.createImage(URL u) throw) {
    //handle exceptions
}
 
Last edited:
I figured it out. Your way is a lot easier, I'm just used to doing things on a much lower level (C programmer). The stream reader would only read what was available() into the array and not the full contentLength() but a while check sum loop read the full content.
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
3K