public static void main(String[] argv) { BufferedImage img = null; byte[] bmpBuf = null; TJTransform xform = new TJTransform(); int flags = 0; try { sf = TJ.getScalingFactors(); if (argv.length < 2) { usage(); } TJScalingFactor scaleFactor = new TJScalingFactor(1, 1); String inFormat = "jpg", outFormat = "jpg"; int outSubsamp = -1, outQual = 95; boolean display = false; if (argv.length > 1) { for (int i = 1; i < argv.length; i++) { if (argv[i].length() < 2) continue; if (argv[i].length() > 2 && argv[i].substring(0, 3).equalsIgnoreCase("-sc")) { int match = 0; if (i < argv.length - 1) { String[] scaleArg = argv[++i].split("/"); if (scaleArg.length == 2) { TJScalingFactor tempsf = new TJScalingFactor( Integer.parseInt(scaleArg[0]), Integer.parseInt(scaleArg[1])); for (int j = 0; j < sf.length; j++) { if (tempsf.equals(sf[j])) { scaleFactor = sf[j]; match = 1; break; } } } } if (match != 1) usage(); } if (argv[i].equalsIgnoreCase("-h") || argv[i].equalsIgnoreCase("-?")) usage(); if (argv[i].length() > 2 && argv[i].substring(0, 3).equalsIgnoreCase("-sa")) { if (i < argv.length - 1) { i++; if (argv[i].substring(0, 1).equalsIgnoreCase("g")) outSubsamp = TJ.SAMP_GRAY; else if (argv[i].equals("444")) outSubsamp = TJ.SAMP_444; else if (argv[i].equals("422")) outSubsamp = TJ.SAMP_422; else if (argv[i].equals("420")) outSubsamp = TJ.SAMP_420; else usage(); } else usage(); } if (argv[i].substring(0, 2).equalsIgnoreCase("-q")) { if (i < argv.length - 1) { int qual = Integer.parseInt(argv[++i]); if (qual >= 1 && qual <= 100) outQual = qual; else usage(); } else usage(); } if (argv[i].substring(0, 2).equalsIgnoreCase("-g")) xform.options |= TJTransform.OPT_GRAY; if (argv[i].equalsIgnoreCase("-hflip")) xform.op = TJTransform.OP_HFLIP; if (argv[i].equalsIgnoreCase("-vflip")) xform.op = TJTransform.OP_VFLIP; if (argv[i].equalsIgnoreCase("-transpose")) xform.op = TJTransform.OP_TRANSPOSE; if (argv[i].equalsIgnoreCase("-transverse")) xform.op = TJTransform.OP_TRANSVERSE; if (argv[i].equalsIgnoreCase("-rot90")) xform.op = TJTransform.OP_ROT90; if (argv[i].equalsIgnoreCase("-rot180")) xform.op = TJTransform.OP_ROT180; if (argv[i].equalsIgnoreCase("-rot270")) xform.op = TJTransform.OP_ROT270; if (argv[i].equalsIgnoreCase("-custom")) xform.cf = new TJExample(); else if (argv[i].length() > 2 && argv[i].substring(0, 2).equalsIgnoreCase("-c")) { if (i >= argv.length - 1) usage(); String[] cropArg = argv[++i].split(","); if (cropArg.length != 3) usage(); String[] dimArg = cropArg[2].split("[xX]"); if (dimArg.length != 2) usage(); int tempx = Integer.parseInt(cropArg[0]); int tempy = Integer.parseInt(cropArg[1]); int tempw = Integer.parseInt(dimArg[0]); int temph = Integer.parseInt(dimArg[1]); if (tempx < 0 || tempy < 0 || tempw < 0 || temph < 0) usage(); xform.x = tempx; xform.y = tempy; xform.width = tempw; xform.height = temph; xform.options |= TJTransform.OPT_CROP; } if (argv[i].substring(0, 2).equalsIgnoreCase("-d")) display = true; if (argv[i].equalsIgnoreCase("-fastupsample")) { System.out.println("Using fast upsampling code"); flags |= TJ.FLAG_FASTUPSAMPLE; } if (argv[i].equalsIgnoreCase("-fastdct")) { System.out.println("Using fastest DCT/IDCT algorithm"); flags |= TJ.FLAG_FASTDCT; } if (argv[i].equalsIgnoreCase("-accuratedct")) { System.out.println("Using most accurate DCT/IDCT algorithm"); flags |= TJ.FLAG_ACCURATEDCT; } } } String[] inFileTokens = argv[0].split("\\."); if (inFileTokens.length > 1) inFormat = inFileTokens[inFileTokens.length - 1]; String[] outFileTokens; if (display) outFormat = "bmp"; else { outFileTokens = argv[1].split("\\."); if (outFileTokens.length > 1) outFormat = outFileTokens[outFileTokens.length - 1]; } File file = new File(argv[0]); int width, height; if (inFormat.equalsIgnoreCase("jpg")) { FileInputStream fis = new FileInputStream(file); int inputSize = fis.available(); if (inputSize < 1) { System.out.println("Input file contains no data"); System.exit(1); } byte[] inputBuf = new byte[inputSize]; fis.read(inputBuf); fis.close(); TJDecompressor tjd; if (xform.op != TJTransform.OP_NONE || xform.options != 0 || xform.cf != null) { TJTransformer tjt = new TJTransformer(inputBuf); TJTransform[] t = new TJTransform[1]; t[0] = xform; t[0].options |= TJTransform.OPT_TRIM; TJDecompressor[] tjdx = tjt.transform(t, 0); tjd = tjdx[0]; } else tjd = new TJDecompressor(inputBuf); width = tjd.getWidth(); height = tjd.getHeight(); int inSubsamp = tjd.getSubsamp(); System.out.println( "Source Image: " + width + " x " + height + " pixels, " + sampName[inSubsamp] + " subsampling"); if (outSubsamp < 0) outSubsamp = inSubsamp; if (outFormat.equalsIgnoreCase("jpg") && (xform.op != TJTransform.OP_NONE || xform.options != 0) && scaleFactor.isOne()) { file = new File(argv[1]); FileOutputStream fos = new FileOutputStream(file); fos.write(tjd.getJPEGBuf(), 0, tjd.getJPEGSize()); fos.close(); System.exit(0); } width = scaleFactor.getScaled(width); height = scaleFactor.getScaled(height); if (!outFormat.equalsIgnoreCase("jpg")) img = tjd.decompress(width, height, BufferedImage.TYPE_INT_RGB, flags); else bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, flags); tjd.close(); } else { img = ImageIO.read(file); if (img == null) throw new Exception("Input image type not supported."); width = img.getWidth(); height = img.getHeight(); if (outSubsamp < 0) { if (img.getType() == BufferedImage.TYPE_BYTE_GRAY) outSubsamp = TJ.SAMP_GRAY; else outSubsamp = TJ.SAMP_444; } } System.gc(); if (!display) System.out.print("Dest. Image (" + outFormat + "): " + width + " x " + height + " pixels"); if (display) { ImageIcon icon = new ImageIcon(img); JLabel label = new JLabel(icon, JLabel.CENTER); JOptionPane.showMessageDialog(null, label, "Output Image", JOptionPane.PLAIN_MESSAGE); } else if (outFormat.equalsIgnoreCase("jpg")) { System.out.println(", " + sampName[outSubsamp] + " subsampling, quality = " + outQual); TJCompressor tjc = new TJCompressor(); int jpegSize; byte[] jpegBuf; tjc.setSubsamp(outSubsamp); tjc.setJPEGQuality(outQual); if (img != null) tjc.setSourceImage(img, 0, 0, 0, 0); else { tjc.setSourceImage(bmpBuf, 0, 0, width, 0, height, TJ.PF_BGRX); } jpegBuf = tjc.compress(flags); jpegSize = tjc.getCompressedSize(); tjc.close(); file = new File(argv[1]); FileOutputStream fos = new FileOutputStream(file); fos.write(jpegBuf, 0, jpegSize); fos.close(); } else { System.out.print("\n"); file = new File(argv[1]); ImageIO.write(img, outFormat, file); } } catch (Exception e) { e.printStackTrace(); System.exit(-1); } }
private static int checkIntBuf( int[] buf, int w, int pitch, int h, int pf, int subsamp, TJScalingFactor sf, int flags) throws Exception { int rshift = TJ.getRedOffset(pf) * 8; int gshift = TJ.getGreenOffset(pf) * 8; int bshift = TJ.getBlueOffset(pf) * 8; int ashift = alphaOffset[pf] * 8; int index, row, col, retval = 1; int halfway = 16 * sf.getNum() / sf.getDenom(); int blockSize = 8 * sf.getNum() / sf.getDenom(); try { for (row = 0; row < halfway; row++) { for (col = 0; col < w; col++) { if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col; else index = pitch * row + col; int r = (buf[index] >> rshift) & 0xFF; int g = (buf[index] >> gshift) & 0xFF; int b = (buf[index] >> bshift) & 0xFF; int a = ashift >= 0 ? (buf[index] >> ashift) & 0xFF : 255; if (((row / blockSize) + (col / blockSize)) % 2 == 0) { if (row < halfway) { checkVal255(row, col, r, "R"); checkVal255(row, col, g, "G"); checkVal255(row, col, b, "B"); } else { checkVal0(row, col, r, "R"); checkVal0(row, col, g, "G"); checkVal0(row, col, b, "B"); } } else { if (subsamp == TJ.SAMP_GRAY) { if (row < halfway) { checkVal(row, col, r, "R", 76); checkVal(row, col, g, "G", 76); checkVal(row, col, b, "B", 76); } else { checkVal(row, col, r, "R", 226); checkVal(row, col, g, "G", 226); checkVal(row, col, b, "B", 226); } } else { checkVal255(row, col, r, "R"); if (row < halfway) { checkVal0(row, col, g, "G"); } else { checkVal255(row, col, g, "G"); } checkVal0(row, col, b, "B"); } } checkVal255(row, col, a, "A"); } } } catch (Exception e) { System.out.println(e); retval = 0; } if (retval == 0) { System.out.print("\n"); for (row = 0; row < h; row++) { for (col = 0; col < w; col++) { int r = (buf[pitch * row + col] >> rshift) & 0xFF; int g = (buf[pitch * row + col] >> gshift) & 0xFF; int b = (buf[pitch * row + col] >> bshift) & 0xFF; if (r < 0) r += 256; if (g < 0) g += 256; if (b < 0) b += 256; System.out.format("%3d/%3d/%3d ", r, g, b); } System.out.print("\n"); } } return retval; }
private static void decompTest( TJDecompressor tjd, byte[] jpegBuf, int jpegSize, int w, int h, int pf, String baseName, int subsamp, int flags, TJScalingFactor sf) throws Exception { String pfStr, tempstr; double t; int scaledWidth = sf.getScaled(w); int scaledHeight = sf.getScaled(h); int temp1, temp2, imgType = pf; BufferedImage img = null; byte[] dstBuf = null; if (yuv == YUVENCODE) return; if (bi) { pf = biTypePF(imgType); pfStr = biTypeStr(imgType); } else pfStr = pixFormatStr[pf]; System.out.print("JPEG -> "); if (yuv == YUVDECODE) System.out.print("YUV " + subName[subsamp] + " ... "); else { System.out.print(pfStr + " "); if (bi) System.out.print("(" + pixFormatStr[pf] + ") "); if ((flags & TJ.FLAG_BOTTOMUP) != 0) System.out.print("Bottom-Up "); else System.out.print("Top-Down "); if (!sf.isOne()) System.out.print(sf.getNum() + "/" + sf.getDenom() + " ... "); else System.out.print("... "); } t = getTime(); tjd.setJPEGImage(jpegBuf, jpegSize); if (tjd.getWidth() != w || tjd.getHeight() != h || tjd.getSubsamp() != subsamp) throw new Exception("Incorrect JPEG header"); temp1 = scaledWidth; temp2 = scaledHeight; temp1 = tjd.getScaledWidth(temp1, temp2); temp2 = tjd.getScaledHeight(temp1, temp2); if (temp1 != scaledWidth || temp2 != scaledHeight) throw new Exception("Scaled size mismatch"); if (yuv == YUVDECODE) dstBuf = tjd.decompressToYUV(flags); else { if (bi) img = tjd.decompress(scaledWidth, scaledHeight, imgType, flags); else dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags); } t = getTime() - t; if (bi) { tempstr = baseName + "_dec_" + pfStr + "_" + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + subName[subsamp] + "_" + (double) sf.getNum() / (double) sf.getDenom() + "x" + ".png"; File file = new File(tempstr); ImageIO.write(img, "png", file); } if (yuv == YUVDECODE) { if (checkBufYUV(dstBuf, dstBuf.length, w, h, subsamp) == 1) System.out.print("Passed."); else { System.out.print("FAILED!"); exitStatus = -1; } } else { if ((bi && checkImg(img, pf, subsamp, sf, flags) == 1) || (!bi && checkBuf( dstBuf, scaledWidth, scaledWidth * TJ.getPixelSize(pf), scaledHeight, pf, subsamp, sf, flags) == 1)) System.out.print("Passed."); else { System.out.print("FAILED!"); exitStatus = -1; } } System.out.format(" %.6f ms\n", t * 1000.); }
private static int checkBuf( byte[] buf, int w, int pitch, int h, int pf, int subsamp, TJScalingFactor sf, int flags) throws Exception { int roffset = TJ.getRedOffset(pf); int goffset = TJ.getGreenOffset(pf); int boffset = TJ.getBlueOffset(pf); int aoffset = alphaOffset[pf]; int ps = TJ.getPixelSize(pf); int index, row, col, retval = 1; int halfway = 16 * sf.getNum() / sf.getDenom(); int blockSize = 8 * sf.getNum() / sf.getDenom(); try { for (row = 0; row < halfway; row++) { for (col = 0; col < w; col++) { if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col * ps; else index = pitch * row + col * ps; byte r = buf[index + roffset]; byte g = buf[index + goffset]; byte b = buf[index + boffset]; byte a = aoffset >= 0 ? buf[index + aoffset] : (byte) 255; if (((row / blockSize) + (col / blockSize)) % 2 == 0) { if (row < halfway) { checkVal255(row, col, r, "R"); checkVal255(row, col, g, "G"); checkVal255(row, col, b, "B"); } else { checkVal0(row, col, r, "R"); checkVal0(row, col, g, "G"); checkVal0(row, col, b, "B"); } } else { if (subsamp == TJ.SAMP_GRAY) { if (row < halfway) { checkVal(row, col, r, "R", 76); checkVal(row, col, g, "G", 76); checkVal(row, col, b, "B", 76); } else { checkVal(row, col, r, "R", 226); checkVal(row, col, g, "G", 226); checkVal(row, col, b, "B", 226); } } else { checkVal255(row, col, r, "R"); if (row < halfway) { checkVal0(row, col, g, "G"); } else { checkVal255(row, col, g, "G"); } checkVal0(row, col, b, "B"); } } checkVal255(row, col, a, "A"); } } } catch (Exception e) { System.out.println(e); retval = 0; } if (retval == 0) { System.out.print("\n"); for (row = 0; row < h; row++) { for (col = 0; col < w; col++) { int r = buf[pitch * row + col * ps + roffset]; int g = buf[pitch * row + col * ps + goffset]; int b = buf[pitch * row + col * ps + boffset]; if (r < 0) r += 256; if (g < 0) g += 256; if (b < 0) b += 256; System.out.format("%3d/%3d/%3d ", r, g, b); } System.out.print("\n"); } } return retval; }