转换AWT图像SVG图像(converting AWT image to SVG Image)

2019-08-04 05:29发布

我用下面的代码摄取的图像AWT(从PDF,通过PDFBox的):

private java.awt.Graphics2D graphics;
public void drawImage(java.awt.Image awtImage, java.awt.geom.AffineTransform at) {
    graphics.setComposite(getGraphicsState().getStrokeJavaComposite());
    graphics.setClip(getGraphicsState().getCurrentClippingPath());
    graphics.drawImage( awtImage, at, null );
}

和希望捕获/输出的图像为SVG。 我一直在使用其生产的形式的SVG的蜡染库

    <image x="0" y="0" transform="matrix(0.144,0,0,0.1439,251.521,271.844)" 
clip-path="url(#clipPath2)" width="1797" xlink:href="data:image/png;
base64,iVBORw0KGgoAAAANSUhEUgAABwUAAAV4CAMAAAB2DvLsAAADAFBMVEX////+/v56 
enpWVlZbW1taWlpZWVnHx8eRkZFVVVWMjIysrKxXV1dYWFhqamr5+fnMzMxeXl7c 
3NyUlJR/f3+3t7cAAACGhob29vYpKSliYmJPT083Nzf8/PyBgYENDQ3s7OwwMDD1 
    ...
    RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE 
RPQP/R8CiIK+y8Q6KQAAAABJRU5ErkJggg==" height="1400"
 preserveAspectRatio="none" stroke-width="0" xmlns:xlink="http://www.w3.org/1999/xlink"/>

我有我自己的SVG库,并想方法添加到我的SVGImage类产生类似的东西。 我需要的AffineTransformation应用于数据,如果又如何?

我将不胜感激必须指出,以适当的(F / OSS)的方法或库,可以做到这一点。 数据应该是内联(如在上面的例子)和XML兼容。

更新:在没有任何回答或评论的,我不得不写我自己的实现。 这不完全是微不足道,可能不可靠或最佳的解决方案。 我附上它作为一个答案 - 请评论,如果它是有缺陷或质量有待提高。

Answer 1:

[在应答自己的问题]

我假设java.awt.ImageBufferedImage作为具有相应的方法。 在目前的情况下这工作(到目前为止)。

的SVG需要MIME类型的图像(例如,“的image/png ”)。 ImageIO需要类型,比如“ PNG ”。 mimeType2ImageTypeMap映射这些。 基于64位编解码器从Xerces的拍摄,但周围也有很多。 DOM实现为XOM和属性建设提供XLink的命名空间

    public class SVGImage extends xom.nu.Element {
    private static final String DATA = "data";
    private static final String BASE64 = "base64";
    public static final String IMAGE_PNG = "image/png";
    public static final String PNG = "PNG";

    private static final String XLINK_PREF = "xlink";
    private static final String HREF = "href";
    private static final String XLINK_NS = "http://www.w3.org/1999/xlink";

        public void readImageData(BufferedImage bufferedImage, String mimeType) {
    String type = mimeType2ImageTypeMap.get(mimeType);
    if (type == null) {
        throw new RuntimeException("Cannot convert mimeType: "+mimeType);
    }
    double x = bufferedImage.getMinX();
    double y = bufferedImage.getMinY();
    double height = bufferedImage.getHeight();
    double width = bufferedImage.getWidth();
    this.setX(x);
    this.setY(y);
    this.setWidth(width);
    this.setHeight(height);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ImageIO.write(bufferedImage, type, baos);
    } catch (IOException e) {
        throw new RuntimeException("Cannot read image", e);
    }
    byte[] byteArray = baos.toByteArray();
    String base64 = Base64.encode(byteArray);
    String attValue = DATA+":"+mimeType+";"+BASE64+","+base64;
    this.addAttribute(new Attribute(XLINK_PREF+":"+HREF, XLINK_NS, attValue));
    }
}

上面的代码已经在测试情况下工作,所以我很乐观,将扩展到大型图像和其他MIME类型,但是没有测试过。

YES:我确实有应用仿射变换。 我已经有实用例程这其中双打的3×2矩阵转换为SVG transform="matrix(...)"属性。 所以,我最后的代码是:

Transform2 t2 = new Transform2(at);              // converts matrix syntax
BufferedImage bImage = (BufferedImage) awtImage;
SVGImage svgImage = new SVGImage();
svgImage.setTransform(t2);
svgImage.readImageData(bImage, SVGImage.IMAGE_PNG);


文章来源: converting AWT image to SVG Image
标签: java image svg awt