import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;
public class ImageResizer2 {
public static void main(String[] args) throws Exception {
File file = new File("inFile.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fileInputStream.read(data);
fileInputStream.close();
try {
SeekableStream s = new FileSeekableStream(file);
RenderedImage op = null;
String codecName = "JPEG";
try {
ImageDecoder dec = ImageCodec.createImageDecoder(codecName, s, null);
op = new NullOpImage(dec.decodeAsRenderedImage(0),
null,
OpImage.OP_IO_BOUND,
null);
} catch (Exception io) {
System.out.println("Error with: " + codecName);
}
BufferedImage bufferedImage = createJPEG4(op.getData(), 0);
if (bufferedImage != null) {
try {
int w = bufferedImage.getWidth();
int h = bufferedImage.getHeight();
BufferedImage dimg = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g = dimg.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(bufferedImage, 0, 0, 100, 100, 0, 0, w, h, null);
g.dispose();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(dimg, "jpg", baos);
baos.flush();
data = baos.toByteArray();
baos.close();
} catch (IOException ex) {
//can't write image - ignore
}
}
writeFile("SeekableStreamOutput.jpg", data);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void writeFile(String name, byte[] data) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
File out = new File(name);
FileOutputStream fOut = new FileOutputStream(out);
fOut.write(data);
fOut.close();
baos.close();
}
/**
* Java's ImageIO can't process 4-component images and Java2D can't apply
* AffineTransformOp either, so convert raster data to RGB. Technique due to
* MArk Stephens. Free for any use.
*/
private static BufferedImage createJPEG4(Raster r, int xform) {
int w = r.getWidth(), h = r.getHeight();
byte[] rgb = new byte[w * h * 3];
// if (Adobe_APP14 and transform==2) then YCCK else CMYK
if (xform == 2) { // YCCK -- Adobe
float[] Y = r.getSamples(0, 0, w, h, 0, (float[]) null), Cb =
r.getSamples(0, 0, w, h, 1, (float[]) null), Cr = r.getSamples(0, 0, w, h, 2, new float[0]);
for (int i = 0, imax = Y.length, base = 0; i < imax; i++, base += 3) {
float k = Y[i], y = Y[i], cb = Cb[i], cr = Cr[i];
double val = y + 1.402 * (cr - 128) - k;
rgb[base] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
: (byte) (val + 0.5);
val = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128) - k;
rgb[base + 1] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
: (byte) (val + 0.5);
val = y + 1.772 * (cb - 128) - k;
rgb[base + 2] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
: (byte) (val + 0.5);
}
} else {
assert xform == 0 : xform; // CMYK
int[] C = r.getSamples(0, 0, w, h, 0, (int[]) null), M =
r.getSamples(0, 0, w, h, 1, (int[]) null), Y = r.getSamples(0, 0, w, h, 2, (int[]) null);
for (int i = 0, imax = C.length, base = 0; i < imax; i++, base += 3) {
int k = C[i];
rgb[base] = (byte) (255 - Math.min(255, C[i] + k));
rgb[base + 1] = (byte) (255 - Math.min(255, M[i] + k));
rgb[base + 2] = (byte) (255 - Math.min(255, Y[i] + k));
}
}
r = Raster.createInterleavedRaster(new DataBufferByte(rgb, rgb.length), w, h, w * 3, 3, new int[]{0, 1, 2}, null);
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel cm = new ComponentColorModel(cs, false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
return new BufferedImage(cm, (WritableRaster) r, true, null);
}
}