图片转换

这是一个使用Java实现的图片转换工具类,支持WMF、SVG、BMP、TIFF和EMF格式之间的转换。通过引入相关库如Batik、FreeHEP等,实现了将不同格式的图片转换为PNG或JPG格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值