📄 imageformatconverter.java
字号:
/**
*
*/
package com.esri.solutions.jitk.web.wcs.data;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.media.jai.ColorCube;
import javax.media.jai.JAI;
import javax.media.jai.KernelJAI;
import javax.media.jai.PlanarImage;
import com.esri.adf.web.util.ImageUtil;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGDecodeParam;
import com.sun.media.jai.codec.PNGDecodeParam;
import com.sun.media.jai.codec.PNGEncodeParam;
import com.sun.media.jai.codec.SeekableStream;
/**
* @author vlad2928
*
*/
public class ImageFormatConverter {
private static byte[] getRGBBytes(PlanarImage src, String imgType) throws IOException {
if(imgType.equalsIgnoreCase("PNG8")) {
// convert 24 bit to 8 bit (3 band to 1 band)
ParameterBlock pb = new ParameterBlock();
ColorCube colorMap = ColorCube.BYTE_496;
KernelJAI[] ditherMask = KernelJAI.DITHER_MASK_443;
pb.addSource(src).add(colorMap).add(ditherMask);
src = JAI.create("ordereddither", pb);
}
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
// Set transparency for the background.
// Currently only support ArcGIS server WCS service.
if(imgType.indexOf("PNG") >= 0) {
PNGEncodeParam.RGB rgb = new PNGEncodeParam.RGB();
PNGEncodeParam.getDefaultEncodeParam(src.getAsBufferedImage());
int[] b = new int[]{0,0,0,0};
rgb.setTransparentRGB(b);
ImageEncoder encoder = ImageCodec.createImageEncoder(imgType, bStream, rgb);
encoder.encode(src.getAsBufferedImage());
} else {
JAI.create("encode", src, bStream, imgType);
}
return bStream.toByteArray();
}
public static InputStream toRGBStream(InputStream imgStream, String imgType) throws IOException {
SeekableStream is = SeekableStream.wrapInputStream(imgStream, true);
imgType = getTrueImageType(imgType);
PlanarImage planarImage = null;
if(imgType.equalsIgnoreCase("PNG")) {
PNGDecodeParam param = new PNGDecodeParam();
param.setExpandPalette(true);
ImageDecoder decoder = ImageCodec.createImageDecoder(imgType, is, param);
planarImage = PlanarImage.wrapRenderedImage(decoder.decodeAsRenderedImage());
} else if(imgType.equalsIgnoreCase("JPEG")) {
JPEGDecodeParam param = new com.sun.media.jai.codec.JPEGDecodeParam();
ImageDecoder decoder = ImageCodec.createImageDecoder(imgType, is, param);
planarImage = PlanarImage.wrapRenderedImage(decoder.decodeAsRenderedImage());
} else {
planarImage = JAI.create("stream", is);
}
BufferedImage bufImg = new BufferedImage(planarImage.getWidth(), planarImage.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bufImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.drawImage(planarImage.getAsBufferedImage(), 0, 0, null);
g2.dispose();
return new ByteArrayInputStream(getRGBBytes(PlanarImage.wrapRenderedImage(bufImg), imgType));
}
public static InputStream toRGBStream(InputStream imgStream, double transparency, String imgType) throws IOException {
InputStream rgbStream = toRGBStream(imgStream, imgType);
if(transparency < 1.0) {
return new ByteArrayInputStream(ImageUtil.applyTransparency(rgbStream, transparency, getTrueImageType(imgType)));
}
return rgbStream;
}
private static String getTrueImageType(String type) {
String ret = "JPEG";
if(type != null) {
type = type.toUpperCase().replaceAll("IMAGE/", "").trim();
if(type.equals("TIFF") || type.equals("TIF")) {
ret = "TIFF";
} else if(type.equals("PNG") || type.equals("PNG8") || type.equals("PNG24")) {
ret = "PNG";
}
}
return ret;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -