本教程将展示如何动态生成PNG图像并在GSP中显示。 这可以作为如何创建更复杂行为的基础。 例如,创建报告图以在您的应用程序中显示。
样本输出
本教程将展示如何根据输入的大小和颜色生成简单的形状。 将支持正方形和圆形。
并且可以将图像合并以在GSP中显示:
即时生成图像
这是在单独的控制器动作上生成正方形和圆形的代码。 java.awt api用于对逻辑进行编程,这是用于生成图形的非常常见的程序包。
package asia.grails.test
import javax.imageio.ImageIO
import java.awt.Color
import java.awt.Graphics
import java.awt.image.BufferedImage
class TestImageController {
def square(int size, String color) {
BufferedImage buffer = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
Graphics g = buffer.createGraphics();
Color gfxColor = new Color(Integer.parseInt(color, 16));
g.setColor(gfxColor);
g.fillRect(0,0,size,size);
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
ImageIO.write(buffer, "png", os);
os.close();
}
def circle(int size, String color) {
BufferedImage buffer = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
Graphics g = buffer.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,0,size,size);
Color gfxColor = new Color(Integer.parseInt(color, 16));
g.setColor(gfxColor);
g.fillArc(0, 0, size, size, 0, 369);
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
ImageIO.write(buffer, "png", os);
os.close();
}
}
对于这两个操作,都将创建一个BufferedImage,它将保存结果图像。 图像缓冲区通过Graphics类进行操作。 生成的图像二进制文件通过response.outputStream对象流传输给用户。 应该设置内容类型,以便浏览器能够理解传入的二进制文件是图像。
如果我们访问此URL,则会生成具有80像素边和青色的正方形图像:http:// localhost:8080 / forum / testImage / square?size = 80&color = 0ff0ff
如果我们访问此URL,则会生成具有150像素直径和蓝色的圆形图像:http:// localhost:8080 / forum / testImage / circle?size = 150&color = 0000ff
在GSP中渲染
在GSP中渲染图像非常简单。 这是一个示例控制器和GSP。
package asia.grails.test
class TestController {
def index() {}
}
index.gsp
<%@ page import="asia.grails.forum.DiscussionThread" %>
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main">
<title>Image Test</title>
</head>
<body>
<g:img dir="testImage" file="square?size=150&color=ff0000"/>
<g:img dir="testImage" file="square?size=50&color=00ff00"/>
<g:img dir="testImage" file="square?size=75&color=0000ff"/>
<g:img dir="testImage" file="circle?size=125&color=00ffff"/>
<g:img dir="testImage" file="circle?size=25&color=ff00ff"/>
<g:img dir="testImage" file="circle?size=225&color=ffff00"/>
</body>
</html>
dir映射到控制器, 文件映射到操作以及请求参数。
结果是如下图所示:
翻译自: https://www.javacodegeeks.com/2015/01/grails-render-images-on-the-fly-in-gsp.html