gpt4 book ai didi

java - 将 AWT 图像转换为 SVG 图像

转载 作者:行者123 更新时间:2023-11-30 09:28:40 25 4
gpt4 key购买 nike

我正在使用以下代码摄取 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。我一直在使用 Batik 库,它生成 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。

更新:在没有任何答案或评论的情况下,我不得不编写自己的实现。这不是完全微不足道的,可能不是健壮的或最好的解决方案。我将其附加为答案 - 如果它有缺陷或可以改进,请发表评论。

最佳答案

[回答自己的问题]

我假设 java.awt.Image 是一个 BufferedImage,因为它具有适当的方法。在目前的情况下,这是有效的(到目前为止)。

SVG 需要图像的 MIME 类型(例如“image/png”)。ImageIO 需要诸如“PNG”之类的类型。mimeType2ImageTypeMap 映射这些。Base64 编解码器取自 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 类型,但还没有测试它们。

是:我必须应用仿射变换。我已经有了实用例程,可以将 3*2 double 矩阵转换为 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);

关于java - 将 AWT 图像转换为 SVG 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com