使用Maven导入jar包
<!-- https://mvnrepository.com/artifact/com.sun.media/jai-codec -->
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai-codec</artifactId>
<version>1.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codeartisans.thirdparties.swing/batik-all -->
<dependency>
<groupId>org.codeartisans.thirdparties.swing</groupId>
<artifactId>batik-all</artifactId>
<version>1.8pre-r1084380</version>
</dependency>
<!-- https://mvnrepository.com/artifact/batik/batik-parser -->
<dependency>
<groupId>batik</groupId>
<artifactId>batik-parser</artifactId>
<version>1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.arnx/wmf2svg -->
<dependency>
<groupId>net.arnx</groupId>
<artifactId>wmf2svg</artifactId>
<version>0.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freehep/freehep-graphicsio-emf -->
<dependency>
<groupId>org.freehep</groupId>
<artifactId>freehep-graphicsio-emf</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.freehep</groupId>
<artifactId>freehep-graphicsio-svg</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.freehep</groupId>
<artifactId>freehep-io</artifactId>
<version>2.0.5</version>
</dependency>
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageEncoder;
import net.arnx.wmf2svg.gdi.svg.SvgGdi;
import net.arnx.wmf2svg.gdi.wmf.WmfParser;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.ImageTranscoder;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.freehep.graphicsio.emf.EMFInputStream;
import org.freehep.graphicsio.emf.EMFPanel;
import org.freehep.graphicsio.emf.EMFRenderer;
import org.freehep.graphicsio.svg.SVGGraphics2D;
import org.w3c.dom.Document;
import javax.imageio.ImageIO;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Properties;
import java.util.zip.GZIPOutputStream;
/**
* Created by xiawenjing on 2017/6/28.
*/
public class PictureUtil {
public static void wmf2png(String src) {
try {
String svgFile = replace(src, "wmf", "svg");
wmfToSvg(src, svgFile);
String jpgFile = replace(src, "wmf", "png");
svgToJpg(svgFile, jpgFile, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void svg2png(String src) {
try {
String pngFile = replace(src, "svg", "png");
svgToJpg(src, pngFile, 150);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void bmp2png(String src) {
try {
String pngFile = replace(src, "bmp", "png");
File out = null;
File in = new File(src);
BufferedImage input = ImageIO.read(in);
out = new File(pngFile);
ImageIO.write(input, "bmp", out);
input.flush();
in.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void tiff2png(String src) {
try {
String dest = replace(src, "tiff", "png");
FileOutputStream out = new FileOutputStream(dest);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", new File(src), null);
ImageEncoder encoder = ImageCodec.createImageEncoder("png", out, null);
encoder.encode(decoder.decodeAsRenderedImage());
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void emf2png(String src) {
try {
String svgPath = replace(src, "emf", "svg");
String dest = replace(src, "emf", "png");
EMFInputStream inputStream = new EMFInputStream(new FileInputStream(src));
EMFRenderer emfRenderer = new EMFRenderer(inputStream);
EMFPanel emfPanel = new EMFPanel();
emfPanel.setRenderer(emfRenderer);
final int width = (int) inputStream.readHeader().getBounds().getWidth();
final int height = (int) inputStream.readHeader().getBounds().getHeight();
Properties p = new Properties();
p.put(SVGGraphics2D.EMBED_FONTS, Boolean.toString(false));
p.put(SVGGraphics2D.CLIP, Boolean.toString(false));
p.put(SVGGraphics2D.COMPRESS, Boolean.toString(false));
p.put(SVGGraphics2D.TEXT_AS_SHAPES, Boolean.toString(false));
p.put(SVGGraphics2D.STYLABLE, Boolean.toString(false));
p.put(SVGGraphics2D.IMAGE_SIZE, width + ", " + height);
// p.put(SVGGraphics2D.EXPORT_IMAGES, Boolean.toString(true));
FileOutputStream svg = new FileOutputStream(svgPath);
SVGGraphics2D graphics2D = new SVGGraphics2D(svg, emfPanel);
graphics2D.setProperties(p);
graphics2D.setDeviceIndependent(true);
graphics2D.startExport();
emfPanel.print(graphics2D);
graphics2D.endExport();
svg.flush();
svg.close();
PictureLostUtil.updatePicture(svgPath, "svg");
svgToJpg(svgPath, dest);
File emf = new File(src);
emf.delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static String svgToJpg(String src, String dest) {
Reader reader = null;
FileOutputStream outputStream = null;
try {
reader = new FileReader(src);
int temp = 0;
StringBuffer sb = new StringBuffer();
while((temp = reader.read())!=-1){
sb.append((char)temp);
}
reader.close();
outputStream = new FileOutputStream(dest);
byte[] bytes = sb.toString().getBytes("utf-8");
PNGTranscoder t = new PNGTranscoder();
TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(bytes));
TranscoderOutput output = new TranscoderOutput(outputStream);
t.transcode(input, output);
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TranscoderException e) {
e.printStackTrace();
}finally {
if (outputStream!=null){
try {
outputStream.close();
File svgFile = new File(src);
svgFile.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return dest;
}
/**
* 将svg转化为JPG
*
* @param src
* @param dest
*/
public static String svgToJpg(String src, String dest, int width) {
FileOutputStream jpgOut = null;
FileInputStream svgStream = null;
ByteArrayOutputStream svgOut = null;
ByteArrayInputStream svgInputStream = null;
ByteArrayOutputStream jpg = null;
try {
// 获取到svg文件
File svg = new File(src);
svgStream = new FileInputStream(svg);
svgOut = new ByteArrayOutputStream();
// 获取到svg的stream
int noOfByteRead = 0;
while ((noOfByteRead = svgStream.read()) != -1) {
svgOut.write(noOfByteRead);
}
JPEGTranscoder it = new JPEGTranscoder();
it.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(0.9f));
// it.addTranscodingHint(ImageTranscoder.KEY_WIDTH, new Float(width));
jpg = new ByteArrayOutputStream();
svgInputStream = new ByteArrayInputStream(svgOut.toByteArray());
it.transcode(new TranscoderInput(svgInputStream),
new TranscoderOutput(jpg));
jpgOut = new FileOutputStream(dest);
jpgOut.write(jpg.toByteArray());
} catch (Exception e) {
System.out.println("src:" + src);
e.printStackTrace();
} finally {
try {
if (svgInputStream != null) {
svgInputStream.close();
}
if (jpg != null) {
jpg.close();
}
if (svgStream != null) {
svgStream.close();
}
if (svgOut != null) {
svgOut.close();
}
if (jpgOut != null) {
jpgOut.flush();
jpgOut.close();
}
File svgFile = new File(src);
svgFile.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
return dest;
}
/**
* 将wmf转换为svg
*
* @param src
* @param dest
*/
public static void wmfToSvg(String src, String dest) {
boolean compatible = false;
try {
InputStream in = new FileInputStream(src);
WmfParser parser = new WmfParser();
final SvgGdi gdi = new SvgGdi(compatible);
parser.parse(in, gdi);
Document doc = gdi.getDocument();
OutputStream out = new FileOutputStream(dest);
if (dest.endsWith(".svgz")) {
out = new GZIPOutputStream(out);
}
output(doc, out);
File wmfFile = new File(src);
wmfFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void output(Document doc, OutputStream out) throws Exception {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
"-//W3C//DTD SVG 1.0//EN");
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd");
transformer.transform(new DOMSource(doc), new StreamResult(out));
out.flush();
out.close();
}
public static String replace(String original, String find, String replace) {
if (original == null || find == null || replace == null) {
return original;
}
int findLen = find.length();
int originalLen = original.length();
if (originalLen == 0 || findLen == 0) {
return original;
}
StringBuffer sb = new StringBuffer();
int begin = 0; //下次检索开始的位置
int i = original.toLowerCase().indexOf(find); //找到的子串位置
while (i != -1) {
sb.append(original.substring(begin, i));
sb.append(replace);
begin = i + findLen;
i = original.toLowerCase().indexOf(find, begin);
}
if (begin < originalLen) {
sb.append(original.substring(begin));
}
return sb.toString();
}
}
PictureLostUtil.java
package cn.com.t600.ols.util;
import java.io.*;
/**
* poi转出bmp图片丢失头部信息
* Created by xiawenjing on 2017/6/29.
*/
public class PictureLostUtil {
private static final String bmpHead = "424D76B00F000000000036000000";
private static final String svgHead = "656E636F64696E673D225554462D382220";
public static void updatePicture(String src, String type) {
try {
StringBuffer sb = new StringBuffer();
FileInputStream fis = new FileInputStream(src);
BufferedInputStream bis = new BufferedInputStream(fis);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1) {
bos.write(buff, 0, len);
}
// 得到图片的字节数组
byte[] result = bos.toByteArray();
String str = byte2HexStr(result);
// 字节数组转成十六进制
if("bmp".equals(type)) {
str = bmpHead + str;
}else if("svg".equals(type)){
str = str.substring(0, 40) + svgHead +str.substring(40);
}else{
return;
}
saveToImgFile(str, src);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void saveToImgFile(String src, String output) {
if (src == null || src.length() == 0) {
return;
}
try {
FileOutputStream out = new FileOutputStream(new File(output));
byte[] bytes = src.getBytes();
for (int i = 0; i < bytes.length; i += 2) {
out.write(charToInt(bytes[i]) * 16 + charToInt(bytes[i + 1]));
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static int charToInt(byte ch) {
int val = 0;
if (ch >= 0x30 && ch <= 0x39) {
val = ch - 0x30;
} else if (ch >= 0x41 && ch <= 0x46) {
val = ch - 0x41 + 10;
}
return val;
}
/**
* 实现字节数组向十六进制的转换方法
*/
public static String byte2HexStr(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs.toUpperCase();
}
}
这是一个使用Java实现的图片转换工具类,支持WMF、SVG、BMP、TIFF和EMF格式之间的转换。通过引入相关库如Batik、FreeHEP等,实现了将不同格式的图片转换为PNG或JPG格式。
4308

被折叠的 条评论
为什么被折叠?



