如何将图像 return 保存到 java 的 <xp: image> url 而不保存到磁盘
How to return the image to the <xp: image> url of java without saving to disk
java 上的工作很少,有必要向 xpages 添加验证码。
java中有一个代码:
public static void getImage() {
String text = "Hello";
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
Font font = new Font("Arial", Font.PLAIN, 48);
g2d.setFont(font);
FontMetrics fm = g2d.getFontMetrics();
int width = fm.stringWidth(text);
int height = fm.getHeight();
g2d.dispose();
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
g2d = img.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2d.setFont(font);
fm = g2d.getFontMetrics();
g2d.setColor(Color.BLACK);
g2d.drawString(text, 0, fm.getAscent());
g2d.dispose();
try {
ImageIO.write(img, "png", new File("c:\Text.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
插入到 <xp:image>
中的图像应该如何处理
您可以创建一个调用 getImage() 方法的 XAgent return URL xp:image。
这是一个 XAgent 示例:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom" rendered="false" viewState="nostate">
<xp:this.beforeRenderResponse><![CDATA[#{javascript:
com.company.getImage();
}]]></xp:this.beforeRenderResponse>
</xp:view>
您需要修改 getImage() 方法以将图像流式传输回来。这是一个示例(未测试):
public static void getImage() {
try {
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream responseStream = response.getOutputStream();
// Add your existing code to create your image here
// Write the image to the responseStream
ImageIO.write(img, "png", responseStream);
FacesContext.getCurrentInstance().responseComplete();
responseStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
然后您可以像这样在 xp:image 中使用 XAgent(假设它被称为 image.xsp):
<xp:image>
<xp:this.url><![CDATA[#{javascript:"/image.xsp"}]]></xp:this.url>
</xp:image>
java 上的工作很少,有必要向 xpages 添加验证码。 java中有一个代码:
public static void getImage() {
String text = "Hello";
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
Font font = new Font("Arial", Font.PLAIN, 48);
g2d.setFont(font);
FontMetrics fm = g2d.getFontMetrics();
int width = fm.stringWidth(text);
int height = fm.getHeight();
g2d.dispose();
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
g2d = img.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2d.setFont(font);
fm = g2d.getFontMetrics();
g2d.setColor(Color.BLACK);
g2d.drawString(text, 0, fm.getAscent());
g2d.dispose();
try {
ImageIO.write(img, "png", new File("c:\Text.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
插入到 <xp:image>
您可以创建一个调用 getImage() 方法的 XAgent return URL xp:image。
这是一个 XAgent 示例:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom" rendered="false" viewState="nostate">
<xp:this.beforeRenderResponse><![CDATA[#{javascript:
com.company.getImage();
}]]></xp:this.beforeRenderResponse>
</xp:view>
您需要修改 getImage() 方法以将图像流式传输回来。这是一个示例(未测试):
public static void getImage() {
try {
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream responseStream = response.getOutputStream();
// Add your existing code to create your image here
// Write the image to the responseStream
ImageIO.write(img, "png", responseStream);
FacesContext.getCurrentInstance().responseComplete();
responseStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
然后您可以像这样在 xp:image 中使用 XAgent(假设它被称为 image.xsp):
<xp:image>
<xp:this.url><![CDATA[#{javascript:"/image.xsp"}]]></xp:this.url>
</xp:image>