我用下面的代码摄取的图像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兼容。
更新:在没有任何回答或评论的,我不得不写我自己的实现。 这不完全是微不足道,可能不可靠或最佳的解决方案。 我附上它作为一个答案 - 请评论,如果它是有缺陷或质量有待提高。
[在应答自己的问题]
我假设java.awt.Image
是BufferedImage
作为具有相应的方法。 在目前的情况下这工作(到目前为止)。
的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);