title: PNGException "crc corruption" when attempting to create ImageIcon objects from ZIP archive
body: <p>I've got a ZIP file containing a number of PNG images that I am trying to load into my Java application as ImageIcon resources directly from the archive. Here's my code:</p>
  
  <pre><code>import java.io.*;
  import java.util.Enumeration;
  import java.util.zip.*;
  import javax.swing.ImageIcon;
  
  public class Test {
    public static void main( String[] args )
    {
      if( args.length == 0 )
      {
        System.out.println("usage: java Test.java file.zip");
        return;
      }
      File archive = new File( args[0] );
      if( !archive.exists() || !archive.canRead() )
      {
        System.err.printf("Unable to find/access %s.\n", archive);
        return;
      }
  
      try {
        ZipFile zip = new ZipFile(archive);
        Enumeration &lt;? extends ZipEntry&gt;e = zip.entries();
        while( e.hasMoreElements() )
        {
          ZipEntry entry = (ZipEntry) e.nextElement();
          int size = (int) entry.getSize();
          int count = (size % 1024 == 0) ? size / 1024 : (size / 1024)+1;
          int offset = 0;
          int nread, toRead;
  
          byte[] buffer = new byte[size];
          for( int i = 0; i &lt; count; i++ )
          {
            offset = 1024*i;
            toRead = (size-offset &gt; 1024) ? 1024 : size-offset;
            nread = zip.getInputStream(entry).read(buffer, offset, toRead);
          }
          ImageIcon icon = new ImageIcon(buffer); // boom -- why?
        }
        zip.close();      
      } catch( IOException ex ) {
        System.err.println(ex.getMessage());
      }
    }
  }
  </code></pre>
  
  <p>The sizes reported by entry.getSize() match the uncompressed size of the PNG files, and I am able to read the data out of the archive without any exceptions, but the creation of the ImageIcon blows up. The stacktrace:</p>
  
  <pre><code>sun.awt.image.PNGImageDecoder$PNGException: crc corruption
   at sun.awt.image.PNGImageDecoder.getChunk(PNGImageDecoder.java:699)
   at sun.awt.image.PNGImageDecoder.getData(PNGImageDecoder.java:707)
   at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:234)
   at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
   at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
   at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
  sun.awt.image.PNGImageDecoder$PNGException: crc corruption
   at sun.awt.image.PNGImageDecoder.getChunk(PNGImageDecoder.java:699)
   at sun.awt.image.PNGImageDecoder.getData(PNGImageDecoder.java:707)
   at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:234)
   at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
   at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
   at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
  </code></pre>
  
  <p>Can anyone shed some light on it? Google hasn't turned up any useful information.</p>