2012-06-27 9 views
3

변환 된 이미지의 품질이 매우 낮습니다. setQuality 메서드를 사용하여 시도했지만 아무것도 변경하지 않는 것.Batik에서 SVGConverter를 사용하여 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")); 

사람이 내가 이미지 품질이 더 나은 만들 수있는 방법을 알고 있나요 :

이 PNG로 SVG로 변환 코드의 일부이다? (바이트 배열을 사용하여) PNG로 SVG를 변환 할 때

답변

4

이 코드를 사용

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" ... > 
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); 

당신은 높이와 너비 리터를 늘려야 ike keyQuality 1.0f를 설정하십시오.

height = 200 인 경우 높이를 200 * 3 (높이 * scalePercentage)만큼 늘립니다. 너비와 비슷합니다.

관련 문제