我转换后的图片质量非常低。我尝试过使用setQuality方法,但它似乎没有改变任何东西。
这是将svg转换为png的代码的一部分:
SVGConverter svgConverter = new SVGConverter();
String[] sources = { "C:/imageData.svg" };
svgConverter.setSources(sources);
svgConverter.setDestinationType(DestinationType.PNG);
svgConverter.setDst(new File("C:/image.png"));
有谁知道如何让图像质量更好?
答案 0 :(得分:6)
我在将SVG转换为PNG(使用字节数组)时使用此代码:
private byte[] renderPng(byte[] svgBytes) {
try {
TranscoderInput transcoderInput = new TranscoderInput(new ByteArrayInputStream(svgBytes));
ByteArrayOutputStream output = new ByteArrayOutputStream();
TranscoderOutput transcoderOutput = new TranscoderOutput(output);
Transcoder transcoder = null;
String type = "png";
if(type.equalsIgnoreCase("png")) {
transcoder = new PNGTranscoder()
{
@Override
protected ImageRenderer createRenderer()
{
ImageRenderer r = super.createRenderer();
RenderingHints rh = r.getRenderingHints();
rh.add(new RenderingHints(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY));
rh.add(new RenderingHints(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC));
rh.add(new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON));
rh.add(new RenderingHints(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_QUALITY));
rh.add(new RenderingHints(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_DISABLE));
rh.add(new RenderingHints(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY));
rh.add(new RenderingHints(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_PURE));
rh.add(new RenderingHints(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON));
rh.add(new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF));
r.setRenderingHints(rh);
return r;
}
};
transcoder.addTranscodingHint(PNGTranscoder.KEY_BACKGROUND_COLOR, Color.WHITE);
} else {
transcoder = new JPEGTranscoder();
Float jpegQuality = new Float(0.95);
// KEY_WIDTH - seems to pick it up just fine from the SVG charts. Set to 560 otherwise.
// KEY_QUALITY 0-1.0 with 1.0 being No Loss. Value must be of type Float. 0.95 is 30% smaller and looks great.
transcoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, jpegQuality);
}
// NOTE: for linux you need Java 1.4.1+ AND the headless environment (e.g. export JAVA_OPTS='-Djava.awt.headless=true').
try {
transcoder.transcode(transcoderInput, transcoderOutput);
}
catch(Exception e) {
logger.error("SVG To Raster response transcode exception", e);
if(output != null) {
output.close();
}
throw( new RuntimeException("SVG To Raster Filter Response Stream Exception", e) );
}
if(output != null) {
output.flush();
output.close();
}
transcoderInput = null;
transcoderOutput = null;
transcoder = null;
return output.toByteArray();
} catch (Exception exc) {
logger.error("Error in rendering png method", exc);
}
return new byte[0];
}
此外,SVG文档中的clipPath元素应包含此属性,否则会出现奇怪的伪像:
<clipPath shape-rendering="geometricPrecision" ... >
答案 1 :(得分:0)
试试这个......
jpeg.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(keyQuality));
jpeg.addTranscodingHint(JPEGTranscoder.KEY_HEIGHT, height*scalePercentage);
jpeg.addTranscodingHint(JPEGTranscoder.KEY_WIDTH, width*scalePercentage);
jpeg.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, 1.0f);
jpeg.addTranscodingHint(JPEGTranscoder.KEY_BACKGROUND_COLOR, Color.WHITE);
你需要增加高度和宽度 设置keyQuality 1.0f。
如果height = 200,则将高度增加200 * 3(高度* scalePercentage)。与宽度相似
答案 2 :(得分:0)
在Apache Batik中,您可以通过传递代码转换器提示KEY_PIXEL_UNIT_TO_MILLIMETER来更改分辨率。
但是重要的是,您需要将高度和宽度缩放为与您要寻找的新分辨率相同的比例。
例如:
我的SVG尺寸为3.5 * 2.0英寸(252 * 144像素)。
目标分辨率为600 DPI。
int RESOLUTION_DPI = 600;
float SCALE_BY_RESOLUTION = RESOLUTION_DPI / 72f;
float scaledWidth = 252*SCALE_BY_RESOLUTION;
float scaledHeight = 144*SCALE_BY_RESOLUTION;
float pixelUnitToMM = new Float(25.4f/RESOLUTION_DPI);
transcoderInput = new TranscoderInput(svgDocument);
TranscoderOutput transcoderOutput = new TranscoderOutput(ostream);
transcoder.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, Color.WHITE);
transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, scaledWidth);
transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, scaledHeight);
transcoder.addTranscodingHint(PNGTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER, pixelUnitToMM);
transcoder.transcode(transcoderInput, transcoderOutput);