private static void bufSizeTest() throws Exception { int w, h, i, subsamp; byte[] srcBuf, jpegBuf; TJCompressor tjc = null; Random r = new Random(); try { tjc = new TJCompressor(); System.out.println("Buffer size regression test"); for (subsamp = 0; subsamp < TJ.NUMSAMP; subsamp++) { for (w = 1; w < 48; w++) { int maxh = (w == 1) ? 2048 : 48; for (h = 1; h < maxh; h++) { if (h % 100 == 0) System.out.format("%04d x %04d\b\b\b\b\b\b\b\b\b\b\b", w, h); srcBuf = new byte[w * h * 4]; jpegBuf = new byte[TJ.bufSize(w, h, subsamp)]; for (i = 0; i < w * h * 4; i++) { srcBuf[i] = (byte) (r.nextInt(2) * 255); } tjc.setSourceImage(srcBuf, w, 0, h, TJ.PF_BGRX); tjc.setSubsamp(subsamp); tjc.setJPEGQuality(100); tjc.compress(jpegBuf, 0); srcBuf = new byte[h * w * 4]; jpegBuf = new byte[TJ.bufSize(h, w, subsamp)]; for (i = 0; i < h * w * 4; i++) { srcBuf[i] = (byte) (r.nextInt(2) * 255); } tjc.setSourceImage(srcBuf, h, 0, w, TJ.PF_BGRX); tjc.compress(jpegBuf, 0); } } } System.out.println("Done. "); } catch (Exception e) { if (tjc != null) tjc.close(); throw e; } if (tjc != null) tjc.close(); }
/** * Create a TurboJPEG compressor instance and associate the uncompressed source image stored in * <code>srcImage</code> with the newly-created instance. * * @param srcImage see {@link #setSourceImage} for description * @param x see {@link #setSourceImage} for description * @param y see {@link #setSourceImage} for description * @param width see {@link #setSourceImage} for description * @param pitch see {@link #setSourceImage} for description * @param height see {@link #setSourceImage} for description * @param pixelFormat see {@link #setSourceImage} for description */ public TJCompressor( byte[] srcImage, int x, int y, int width, int pitch, int height, int pixelFormat) throws Exception { setSourceImage(srcImage, x, y, width, pitch, height, pixelFormat); }
/** * Associate an uncompressed source image with this compressor instance. * * @param srcImage see {@link #setSourceImage(byte[], int, int, int, int, int, int)} for * description * @param width see {@link #setSourceImage(byte[], int, int, int, int, int, int)} for description * @param pitch see {@link #setSourceImage(byte[], int, int, int, int, int, int)} for description * @param height see {@link #setSourceImage(byte[], int, int, int, int, int, int)} for description * @param pixelFormat pixel format of the source image (one of {@link TJ TJ.PF_*}) */ public void setSourceImage(byte[] srcImage, int width, int pitch, int height, int pixelFormat) throws Exception { setSourceImage(srcImage, 0, 0, width, pitch, height, pixelFormat); srcX = srcY = -1; }
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 compTest( TJCompressor tjc, byte[] dstBuf, int w, int h, int pf, String baseName, int subsamp, int jpegQual, int flags) throws Exception { String tempstr; byte[] srcBuf = null; BufferedImage img = null; String pfStr; double t; int size = 0, ps, imgType = pf; if (bi) { pf = biTypePF(imgType); pfStr = biTypeStr(imgType); } else pfStr = pixFormatStr[pf]; ps = TJ.getPixelSize(pf); 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 "); System.out.print(" -> " + subNameLong[subsamp] + " "); if (yuv == YUVENCODE) System.out.print("YUV ... "); else System.out.print("Q" + jpegQual + " ... "); if (bi) { img = new BufferedImage(w, h, imgType); initImg(img, pf, flags); tempstr = baseName + "_enc_" + pfStr + "_" + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + subName[subsamp] + "_Q" + jpegQual + ".png"; File file = new File(tempstr); ImageIO.write(img, "png", file); } else { srcBuf = new byte[w * h * ps + 1]; initBuf(srcBuf, w, w * ps, h, pf, flags); } Arrays.fill(dstBuf, (byte) 0); t = getTime(); tjc.setSubsamp(subsamp); tjc.setJPEGQuality(jpegQual); if (bi) { if (yuv == YUVENCODE) tjc.encodeYUV(img, dstBuf, flags); else tjc.compress(img, dstBuf, flags); } else { tjc.setSourceImage(srcBuf, w, 0, h, pf); if (yuv == YUVENCODE) tjc.encodeYUV(dstBuf, flags); else tjc.compress(dstBuf, flags); } size = tjc.getCompressedSize(); t = getTime() - t; if (yuv == YUVENCODE) tempstr = baseName + "_enc_" + pfStr + "_" + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + subName[subsamp] + ".yuv"; else tempstr = baseName + "_enc_" + pfStr + "_" + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + subName[subsamp] + "_Q" + jpegQual + ".jpg"; writeJPEG(dstBuf, size, tempstr); if (yuv == YUVENCODE) { if (checkBufYUV(dstBuf, size, w, h, subsamp) == 1) System.out.print("Passed."); else { System.out.print("FAILED!"); exitStatus = -1; } } else System.out.print("Done."); System.out.format(" %.6f ms\n", t * 1000.); System.out.println(" Result in " + tempstr); return size; }