/** * Copyright 2014 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl.util.texture; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; /** * Utilities for image input and output * */ public class ImageIOUtil { /** * Constant which can be used as a file suffix to indicate a JPEG stream. *
* {@code 'i' 'c' 'n' 's' ascii code} *
** {@code GIF87A or GIF89A ascii code} *
** {@code BM ascii code} *
** TODO *
** TODO *
** TODO *
** Intentionally detects only the little endian tiff images ("II" in the spec). *
** "474 saved as a short" 474 = 0x01DA *
** 'D' 'D' 'S' ' ' ascii code *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
** TODO *
*null
* @throws java.io.IOException if an I/O exception occurred
*/
public static String getFileSuffix(InputStream stream) throws IOException {
if (stream == null) {
throw new IOException("Stream was null");
}
if (!(stream instanceof BufferedInputStream)) {
stream = new BufferedInputStream(stream);
}
if (!stream.markSupported()) {
throw new IOException("Can not get non-destructively the image format");
}
if (stream.available() < 32) {
throw new IOException("Not enough bytes to read in order to get the image format");
}
try {
stream.mark(32);
final byte[] b = new byte[32];
stream.read(b);
return getFileSuffix(b);
} finally {
stream.reset();
}
}
/**
* Determines the file suffix (i.e the image format) of the given bytes from the header
* of a file.
*
* @param stream stream to check
* @return the file suffix if any, otherwise null
* @throws java.io.IOException if an I/O exception occurred
*/
public static String getFileSuffix(final byte[] b) {
if ( (b[0] == 0xff && b[1] == 0xd8 /* && b[2] == 0xff */) ||
(b[0] == 0x4A && b[1] == 0x46 && b[2] == 0x49 && b[3] == 0x46)/* JFIF */ ||
(b[0] == 0x45 && b[1] == 0x78 && b[2] == 0x69 && b[3] == 0x66)/* EXIF */) {
return T_JPG;
}
if (b[0] == 0x89 && b[1] == 0x50 && b[2] == 0x4E && b[3] == 0x47 && /* 'P' 'N' 'G', ascii code */
b[4] == 0x0D && b[5] == 0x0A && b[6] == 0x1A && b[7] == 0x0A) {
return T_PNG;
}
if (b[0] == 0x69 && b[1] == 0x63 && b[2] == 0x6E && b[3] == 0x73) {
return T_ICNS;
}
if (b[0] == 0x47 && b[1] == 0x49 && b[2] == 0x46 && b[3] == 0x38 && (b[4] == 0x37 || b[4] == 0x39) &&
b[5] == 0x61) {
return T_GIF;
}
if (b[0] == 0x42 && b[1] == 0x4d) {
return T_BMP;
}
if (b[0] == 0x3A && b[1] == 0xDE && b[2] == 0x68 && b[3] == 0xB1) {
return T_DCX;
}
if (b[0] == 0x0A && b[1] == 0x05 && b[2] == 0x01 && b[3] == 0x08) {
return T_PCX;
}
if (b[0] == 0x50 && (b[1] == 0x33 /* plain */|| b[1] == 0x36)) {
return T_PPM;
}
if (b[0] == 0x38 && b[1] == 0x42 && b[2] == 0x50 && b[3] == 0x53 && b[4] == 0x00 && b[5] == 0x01 &&
b[6] == 0x00 && b[7] == 0x00 && b[8] == 0x00 && b[9] == 0x00) {
// Adobe PhotoShop
return T_PSD;
}
if (b[0] == 0x49 && b[1] == 0x49 && b[2] == 0x2A && b[3] == 0x00) {
return T_TIFF;
}
if (b[0] == 0x01 && b[1] == 0xDA /* && b[2] == 0x01 && b[3] == 0x01 && b[4] == 0x00 && b[5] == 0x03 */) {
return T_SGI_RGB;
}
if (b[0] == 0x44 && b[1] == 0x44 && b[2] == 0x53 && b[3] == 0x20) {
return T_DDS;
}
if (b[0] == 0x50 && b[1] == 0x37) {
return T_PAM;
}
if (b[0] == 0x50 && (b[1] == 0x32 /* plain */|| b[1] == 0x35)) {
return T_PGM;
}
if (b[0] == 0x50 && (b[1] == 0x31 /* plain */|| b[1] == 0x34)) {
return T_PBM;
}
if (b[0] == 0x3D && b[1] == 0x02) {
return T_3D2;
}
if (b[0] == 0x33 && b[1] == 0x44 && b[2] == 0x4D && b[3] == 0x46) {
return T_3DMF;
}
if (b[0] == 0x2A && b[1] == 0x2A && b[2] == 0x54 && b[3] == 0x49 && b[4] == 0x39 && b[5] == 0x32 &&
b[6] == 0x2A && b[7] == 0x2A && b[8] == 0x01 && b[9] == 0x00 && b[10] == 0x58 &&
b[11] == 0x6E && b[12] == 0x56 && b[13] == 0x69) {
return T_92I;
}
if (b[0] == 0x41 && b[1] == 0x4D && b[2] == 0x46 && b[3] == 0x46) {
return T_AMFF;
}
if (b[0] == 0x4A && b[1] == 0x47 && (b[2] == 0x03 || b[2] == 0x04) && b[3] == 0x0E && b[4] == 0x00 &&
b[5] == 0x00 && b[6] == 0x00) {
return T_ART;
}
if (b[0] == 0x73 && b[1] == 0x72 && b[2] == 0x63 && b[3] == 0x64 && b[4] == 0x6F && b[5] == 0x63 &&
b[6] == 0x69 && b[7] == 0x64 && b[8] == 0x3A) {
return T_CALS;
}
if (b[0] == 0x07 && b[1] == 0x20 && b[2] == 0x4D && b[3] == 0x4D) {
return T_CAM;
}
if (b[0] == 0x20 && b[1] == 0x77 && b[2] == 0x00 && b[3] == 0x02) {
return T_CBD;
}
if (b[0] == 0x45 && b[1] == 0x59 && b[2] == 0x45 && b[3] == 0x53) {
return T_CE2;
}
if (b[0] == 0x80 && b[1] == 0x2A && b[2] == 0x5F && b[3] == 0xD7 && b[4] == 0x00 && b[5] == 0x00 &&
b[6] == 0x08 && b[7] == 0x00 && b[8] == 0x00 && b[9] == 0x00 && b[10] == 0x04 &&
b[11] == 0x00 && b[12] == 0x00 && b[13] == 0x00) {
return T_CIN;
}
if (b[0] == 0x43 && b[1] == 0x61 && b[2] == 0x6C && b[3] == 0x69 && b[4] == 0x67 && b[5] == 0x61 &&
b[6] == 0x72 && b[7] == 0x69) {
return T_COB;
}
if (b[0] == 0x43 && b[1] == 0x50 && b[2] == 0x54 && b[3] == 0x46 && b[4] == 0x49 && b[5] == 0x4C &&
b[6] == 0x45) {
return T_CPT;
}
if (b[0] == 0x43 && b[1] == 0x41 && b[2] == 0x4C && b[3] == 0x41 && b[4] == 0x4D && b[5] == 0x55 &&
b[6] == 0x53 && b[7] == 0x43 && b[8] == 0x56 && b[9] == 0x47) {
return T_CVG;
}
if (b[0] == 0x56 && b[1] == 0x69 && b[2] == 0x73 && b[3] == 0x74 && b[4] == 0x61 && b[5] == 0x20 &&
b[6] == 0x44 && b[7] == 0x45 && b[8] == 0x4D && b[9] == 0x20 && b[10] == 0x46 &&
b[11] == 0x69 && b[12] == 0x6C && b[13] == 0x65) {
return T_DEM;
}
if (b[0] == 0x42 && b[1] == 0x4D && b[2] == 0x36) {
return T_DIB;
}
if (b[0] == 0x53 && b[1] == 0x44 && b[2] == 0x50 && b[3] == 0x58) {
return T_DPX;
}
if (b[0] == 0x01 && b[1] == 0xFF && b[2] == 0x02 && b[3] == 0x04 && b[4] == 0x03 && b[5] == 0x02) {
return T_DRW;
}
if (b[0] == 0x41 && b[1] == 0x43 && b[2] == 0x31 && b[3] == 0x30) {
return T_DWG;
}
if (b[0] == 0x65 && b[1] == 0x02 && b[2] == 0x01 && b[3] == 0x02) {
return T_ECW;
}
if (b[0] == 0x01 && b[1] == 0x00 && b[2] == 0x00 && b[3] == 0x00 && b[4] == 0x58 && b[5] == 0x00 &&
b[6] == 0x00 && b[7] == 0x00) {
return T_EMF;
}
if (b[0] == 0xD0 && b[1] == 0xCF && b[2] == 0x11 && b[3] == 0xE0 && b[4] == 0xA1 && b[5] == 0xB1 &&
b[6] == 0x1A && b[7] == 0xE1 && b[8] == 0x00) {
return T_FPX;
}
if (b[0] == 0x53 && b[1] == 0x49 && b[2] == 0x4D && b[3] == 0x50 && b[4] == 0x4C && b[5] == 0x45 &&
b[6] == 0x20 && b[7] == 0x20 && b[8] == 0x3D) {
return T_FTS;
}
if (b[0] == 0x48 && b[1] == 0x50 && b[2] == 0x48 && b[3] == 0x50 && b[4] == 0x34 && b[5] == 0x38 &&
b[6] == 0x2D && b[7] == 0x45 && b[8] == 0x1E && b[9] == 0x2B) {
return T_GRO;
}
if (b[0] == 0x6E && b[1] == 0x63 && b[2] == 0x6F && b[3] == 0x6C && b[4] == 0x73) {
return T_HDR;
}
if (b[0] == 0x35 && b[1] == 0x4B && b[2] == 0x50 && b[3] == 0x35 && b[4] == 0x31 && b[5] == 0x5D &&
b[6] == 0x2A && b[7] == 0x67 && b[8] == 0x72 && b[9] == 0x72 && b[10] == 0x80 &&
b[11] == 0x83 && b[12] == 0x85 && b[13] == 0x63) {
return T_HRU;
}
if (b[0] == 0xEB && b[1] == 0x3C && b[2] == 0x90 && b[3] == 0x2A) {
return T_IMG;
}
if (b[0] == 0x65 && b[1] == 0x6C && b[2] == 0x6D && b[3] == 0x6F) {
return T_INFINI_D;
}
if (b[0] == 0x49 && b[1] == 0x57 && b[2] == 0x43 && b[3] == 0x01) {
return T_IWC;
}
if (b[0] == 0x80 && b[1] == 0x3E && b[2] == 0x44 && b[3] == 0x53 && b[4] == 0x43 && b[5] == 0x49 &&
b[6] == 0x4D) {
return T_J6I;
}
if (b[0] == 0x4A && b[1] == 0x49 && b[2] == 0x46 && b[3] == 0x39 && b[4] == 0x39 && b[5] == 0x61) {
return T_JIF;
}
if (b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x00 && b[3] == 0x0C && b[4] == 0x6A && b[5] == 0x50 &&
b[6] == 0x20 && b[7] == 0x20 && b[8] == 0x0D && b[9] == 0x0A && b[10] == 0x87 &&
b[11] == 0x0A) {
return T_JP2;
}
if (b[0] == 0x4D && b[1] == 0x4D && b[2] == 0x00 && b[3] == 0x2A) {
return T_KDC;
}
if (b[0] == 0x36 && b[1] == 0x34 && b[2] == 0x4C && b[3] == 0x41 && b[4] == 0x4E && b[5] == 0x20 &&
b[6] == 0x49 && b[7] == 0x44 && b[8] == 0x42 && b[9] == 0x4C && b[10] == 0x4F &&
b[11] == 0x43 && b[12] == 0x4B) {
return T_L64;
}
if (b[0] == 0x46 && b[1] == 0x4F && b[2] == 0x52 && b[3] == 0x4D) {
return T_LBM;
}
if (b[0] == 0x49 && b[1] == 0x49 && b[2] == 0x2A && b[3] == 0x00 && b[4] == 0x08 && b[5] == 0x00 &&
b[6] == 0x00 && b[7] == 0x00 && b[8] == 0x0E && b[9] == 0x00 && b[10] == 0x00 &&
b[11] == 0x01 && b[12] == 0x04 && b[13] == 0x00) {
return T_LDF;
}
if (b[0] == 0x57 && b[1] == 0x56 && b[2] == 0x02 && b[3] == 0x00 && b[4] == 0x47 && b[5] == 0x45 &&
b[6] == 0x00 && b[7] == 0x0E) {
return T_LWF;
}
if (b[0] == 0x37 && b[1] == 0x00 && b[2] == 0x00 && b[3] == 0x10 && b[4] == 0x42 && b[5] == 0x00 &&
b[6] == 0x00 && b[7] == 0x10 && b[8] == 0x00 && b[9] == 0x00 && b[10] == 0x00 &&
b[11] == 0x00 && b[12] == 0x39 && b[13] == 0x64) {
return T_MBM;
}
if (b[0] == 0x4D && b[1] == 0x47 && b[2] == 0x4C) {
return T_MGL;
}
if (b[0] == 0x7B && b[1] == 0x0A && b[2] == 0x20 && b[3] == 0x20 && b[4] == 0x43 && b[5] == 0x72 &&
b[6] == 0x65 && b[7] == 0x61 && b[8] == 0x74 && b[9] == 0x65 && b[10] == 0x64) {
return T_MIF;
}
if (b[0] == 0x8A && b[1] == 0x4D && b[2] == 0x4E && b[3] == 0x47 && b[4] == 0x0D && b[5] == 0x0A &&
b[6] == 0x1A && b[7] == 0x0A) {
return T_MNG;
}
if (b[0] == 0x4D && b[1] == 0x50 && b[2] == 0x46) {
return T_MPW;
}
if (b[0] == 0x44 && b[1] == 0x61 && b[2] == 0x6E && b[3] == 0x4D) {
return T_MSP;
}
if (b[0] == 0x43 && b[1] == 0x36 && b[2] == 0x34) {
return T_N64;
}
if (b[0] == 0x6E && b[1] == 0x6E && b[2] == 0x0A && b[3] == 0x00 && b[4] == 0x5E && b[5] == 0x00) {
return T_NCR;
}
if (b[0] == 0x6E && b[1] == 0x66 && b[2] == 0x66) {
return T_NFF;
}
if (b[0] == 0x4E && b[1] == 0x47 && b[2] == 0x47 && b[3] == 0x00 && b[4] == 0x01 && b[5] == 0x00) {
return T_NGG;
}
if (b[0] == 0x4E && b[1] == 0x4C && b[2] == 0x4D && b[3] == 0x20 && b[4] == 0x01 && b[5] == 0x02 &&
b[6] == 0x00) {
return T_NLM;
}
if (b[0] == 0x4E && b[1] == 0x4F && b[2] == 0x4C && b[3] == 0x00 && b[4] == 0x01 && b[5] == 0x00 &&
b[6] == 0x06 && b[7] == 0x01 && b[8] == 0x03 && b[9] == 0x00) {
return T_NOL;
}
if (b[0] == 0x41 && b[1] == 0x48) {
return T_PAL;
}
if (b[0] == 0x50 && b[1] == 0x41 && b[2] == 0x58) {
return T_PAX;
}
if (b[0] == 0x63 && b[1] == 0x52 && b[2] == 0x01 && b[3] == 0x01 && b[4] == 0x38 && b[5] == 0x09 &&
b[6] == 0x3D && b[7] == 0x00) {
return T_PCD;
}
if (b[0] == 0x1B && b[1] == 0x45 && b[2] == 0x1B && b[3] == 0x26 && b[4] == 0x6C && b[5] == 0x30 &&
b[6] == 0x4F && b[7] == 0x1B && b[8] == 0x26 && b[9] == 0x6C && b[10] == 0x30 &&
b[11] == 0x45 && b[12] == 0x1B && b[13] == 0x26) {
return T_PCL;
}
if (b[0] == 0x50 && b[1] == 0x49 && b[2] == 0x58 && b[3] == 0x20) {
return T_PIX;
}
if (b[0] == 0x50 && b[1] == 0x4F && b[2] == 0x4C && b[3] == 0x20 && b[4] == 0x46 && b[5] == 0x6F &&
b[6] == 0x72 && b[7] == 0x6D && b[8] == 0x61 && b[9] == 0x74) {
return T_POL;
}
if (b[0] == 0x7E && b[1] == 0x42 && b[2] == 0x4B && b[3] == 0x00) {
return T_PSP;
}
if (b[0] == 0x50 && b[1] == 0x61 && b[2] == 0x69 && b[3] == 0x6E && b[4] == 0x74 && b[5] == 0x20 &&
b[6] == 0x53 && b[7] == 0x68 && b[8] == 0x6F && b[9] == 0x70 && b[10] == 0x20 &&
b[11] == 0x50 && b[12] == 0x72 && b[13] == 0x6F && b[14] == 0x20 && b[15] == 0x49 &&
b[16] == 0x6D && b[17] == 0x61 && b[18] == 0x67 && b[19] == 0x65 && b[20] == 0x20 &&
b[21] == 0x46 && b[22] == 0x69 && b[23] == 0x6C && b[24] == 0x65) {
return T_PSP;
}
if (b[0] == 0x51 && b[1] == 0x4C && b[2] == 0x49 && b[3] == 0x49 && b[4] == 0x46 && b[5] == 0x41 &&
b[6] == 0x58) {
return T_QFX;
}
if (b[0] == 0x6D && b[1] == 0x6F && b[2] == 0x6F && b[3] == 0x76) {
return T_QTM;
}
if (b[0] == 0x46 && b[1] == 0x4F && b[2] == 0x52 && b[3] == 0x4D && b[4] == 0x41 && b[5] == 0x54 &&
b[6] == 0x3D) {
return T_RAD;
}
if (b[0] == 0x59 && b[1] == 0xA6 && b[2] == 0x6A && b[3] == 0x95) {
return T_RAS;
}
if (b[0] == 0x52 && b[1] == 0x49 && b[2] == 0x58 && b[3] == 0x33) {
return T_RIX;
}
if (b[0] == 0x23 && b[1] == 0x20 && b[2] == 0x24 && b[3] == 0x49 && b[4] == 0x64 && b[5] == 0x3A &&
b[6] == 0x20) {
return T_SID;
}
if (b[0] == 0x41 && b[1] == 0x75 && b[2] == 0x74 && b[3] == 0x6F && b[4] == 0x43 && b[5] == 0x41 &&
b[6] == 0x44 && b[7] == 0x20 && b[8] == 0x53 && b[9] == 0x6C && b[10] == 0x69 &&
b[11] == 0x64 && b[12] == 0x65) {
return T_SLD;
}
if (b[0] == 0x53 && b[1] == 0x74 && b[2] == 0x6F && b[3] == 0x72 && b[4] == 0x6D && b[5] == 0x33 &&
b[6] == 0x44) {
return T_SOD;
}
if (b[0] == 0xFA && b[1] == 0xDE && b[2] == 0xBA && b[3] == 0xBE && b[4] == 0x01 && b[5] == 0x01) {
return T_WIC;
}
if (b[0] == 0xD3 && b[1] == 0x23 && b[2] == 0x00 && b[3] == 0x00 && b[4] == 0x03 && b[5] == 0x00 &&
b[6] == 0x00 && b[7] == 0x00) {
return T_WLM;
}
if (b[0] == 0xD7 && b[1] == 0xCD && b[2] == 0xC6 && b[3] == 0x9A) {
return T_WMF;
}
if (b[0] == 0xFF && b[1] == 0x57 && b[2] == 0x50 && b[3] == 0x43 && b[4] == 0x10) {
return T_WPG;
}
if (b[0] == 0x23 && b[1] == 0x56 && b[2] == 0x52 && b[3] == 0x4D && b[4] == 0x4C && b[5] == 0x20 &&
b[6] == 0x56 && b[7] == 0x32 && b[8] == 0x2E && b[9] == 0x30) {
return T_WRL;
}
if (b[0] == 0x23 && b[1] == 0x64 && b[2] == 0x65 && b[3] == 0x66 && b[4] == 0x69 && b[5] == 0x6E &&
b[6] == 0x65) {
return T_XBM;
}
if (b[0] == 0x2F && b[1] == 0x2A && b[2] == 0x20 && b[3] == 0x58 && b[4] == 0x50 && b[5] == 0x4D &&
b[6] == 0x20 && b[7] == 0x2A && b[8] == 0x2F) {
return T_XPM;
}
return null;
}
}