Java Wicket从文件系统创建图像
我正在制作一个项目,在这个项目中,当用户单击一个产品时,会打开一个带有产品名称的模式窗口。我还希望在面板内的模态窗口中包含产品图像。图像存储在我的服务器上的一个目录中 我指的是这个链接 我的面板html代码如下所示 ItemOrderPanel.htmlJava Wicket从文件系统创建图像,java,image,wicket,Java,Image,Wicket,我正在制作一个项目,在这个项目中,当用户单击一个产品时,会打开一个带有产品名称的模式窗口。我还希望在面板内的模态窗口中包含产品图像。图像存储在我的服务器上的一个目录中 我指的是这个链接 我的面板html代码如下所示 ItemOrderPanel.html <div> <li><a wicket:id="link"></a></li> </div> 在WicketApp
<div>
<li><a wicket:id="link"></a></li>
</div>
在WicketApplication.java中
mountResource("/orderPage/{name}",new ImageResourceReference());
我对WicketApplication.java中的这一行表示怀疑
我已经创建了这样的资源文件
ImageResourceReference.java
public class ImageResourceReference extends ResourceReference{
public ImageResourceReference(){
super(ImageResourceReference.class,"imagesDemo");
}
@Override
public IResource getResource() {
return new ImageResource();
}
private static class ImageResource extends DynamicImageResource{
private static final long serialVersionUID = 1L;
@Override
protected byte[] getImageData(Attributes attributes) {
PageParameters parameters = attributes.getParameters();
StringValue name = parameters.get("name");
byte[] imageBytes = null;
if(name.isEmpty() == false)
imageBytes = getImageAsBytes(name.toString());
return imageBytes;
}
private byte[] getImageAsBytes(String label){
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.BLACK);
g.setBackground(Color.WHITE);
g.clearRect(0, 0, image.getWidth(), image.getHeight());
//g.setFont(new Font("SansSerif", Font.PLAIN, 48));
g.drawString(label, 50, 50);
g.dispose();
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = writers.next();
if (writer == null) {
throw new RuntimeException("JPG not supported?!");
}
final ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] imageBytes = null;
try {
ImageOutputStream imageOut = ImageIO.createImageOutputStream(out);
writer.setOutput(imageOut);
writer.write(image);
imageOut.close();
imageBytes = out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return imageBytes;
}
@Override
public boolean equals(Object that){
return that instanceof ImageResource;
}
}
公共类ImageResourceReference扩展了ResourceReference{
公共ImageResourceReference(){
super(ImageResourceReference.class,“imagesDemo”);
}
@凌驾
公共IResource getResource(){
返回新的ImageResource();
}
私有静态类ImageResource扩展DynamicImageResource{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护字节[]getImageData(属性){
PageParameters=attributes.getParameters();
StringValue name=parameters.get(“name”);
byte[]imageBytes=null;
if(name.isEmpty()==false)
imageBytes=getImageAsBytes(name.toString());
返回imageBytes;
}
专用字节[]getImageAsBytes(字符串标签){
BuffereImage=新的BuffereImage(800600,BuffereImage.TYPE_INT_RGB);
Graphics2D g=(Graphics2D)image.getGraphics();
g、 设置颜色(颜色为黑色);
g、 挫折地面(颜色:白色);
g、 clearRect(0,0,image.getWidth(),image.getHeight());
//g、 setFont(新字体(“SansSerif”,Font.PLAIN,48));
g、 抽绳(标签,50,50);
g、 处置();
迭代器编写器=ImageIO.getImageWritersByFormatName(“jpeg”);
ImageWriter writer=writers.next();
if(writer==null){
抛出新的RuntimeException(“不支持JPG?!”);
}
final ByteArrayOutputStream out=新ByteArrayOutputStream();
byte[]imageBytes=null;
试一试{
ImageOutputStream imageOut=ImageIO.createImageOutputStream(输出);
writer.setOutput(imageOut);
作家。写作(形象);
imageOut.close();
imageBytes=out.toByteArray();
}捕获(IOE异常){
e、 printStackTrace();
}
返回imageBytes;
}
@凌驾
公共布尔等于(该对象){
返回ImageResource的该实例;
}
}
}
但是当我调试代码时,我发现控件没有进入内部ImageResource类,该类返回字节
我想在我的面板上显示图像图片。我的面板上显示的链接是我存储在本地系统数据库中的链接
感谢您的帮助和建议!提前谢谢 使用DynamicImageResource并以字节为单位获取图像。使用DynamicImageResource并以字节为单位获取图像。 您可以在这里找到一些信息。
您可以在这里找到一些信息。我认为问题在于您创建了两个不同的ImageResourceReference实例(我认为这在原始文章中也是一个问题)。因此,我将在ItemOrderPanel.java中执行以下操作:
WebApplication.get().
getResourceReferenceRegistry().
getResourceReference(
ImageResourceReference.class,
"imagesDemo",
null,
null,
null,
true,
false)
另外,请确保您没有使用非常通用的URL映射任何其他资源或页面,例如“/”可能比“orderPage”具有更高的优先级。根据下面的Wiki页面:
首先询问具有更大IRequestMapper.getCompatibilityScore(请求)的映射程序
有关详细信息,请参阅本页:
那就好了!;) 我认为问题在于您创建了两个不同的ImageResourceReference实例(我认为这在原始文章中也是一个问题)。因此,我将在ItemOrderPanel.java中执行以下操作:
WebApplication.get().
getResourceReferenceRegistry().
getResourceReference(
ImageResourceReference.class,
"imagesDemo",
null,
null,
null,
true,
false)
另外,请确保您没有使用非常通用的URL映射任何其他资源或页面,例如“/”可能比“orderPage”具有更高的优先级。根据下面的Wiki页面:
首先询问具有更大IRequestMapper.getCompatibilityScore(请求)的映射程序
有关详细信息,请参阅本页:
那就好了!;) 最后我决定在ItemOrderPanel.java中使用这段代码
final ResourceReference imageResourceReference = new ImageResourceReference();
String imageName = itm.getProductImage();
final PageParameters parameters = new PageParameters();
parameters.set("name", imageName);
CharSequence urlForImage = getRequestCycle().urlFor(imageResourceReference,parameters);
ExternalLink link = new ExternalLink("link", urlForImage.toString());
link.setBody(Model.of(imageName));
add(link);
add(new NonCachingImage("img", new AbstractReadOnlyModel<DynamicImageResource>(){
@Override public DynamicImageResource getObject() {
DynamicImageResource dir = new DynamicImageResource() {
@Override protected byte[] getImageData(Attributes attributes) {
StringValue name = parameters.get("name");
byte[] imageBytes = null;
if(name.isEmpty() == false)
imageBytes = getImageAsBytes(name.toString());
return imageBytes;
}
};
dir.setFormat("image/png");
return dir;
}
}));
private byte[] getImageAsBytes(String label){
byte[] imageBytes = null;
try {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
InputStream inStream = new FileInputStream(new File(label));
copy(inStream, outStream);
inStream.close();
outStream.close();
return outStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return imageBytes;
}
private void copy(InputStream source, OutputStream destination)
throws IOException
{
// Transfer bytes from source to destination
byte[] buf = new byte[1024];
int len;
while ((len = source.read(buf)) > 0) {
destination.write(buf, 0, len);
}
source.close();
destination.close();
}
add(新的非机器图像(“img”),新的AbstractReadOnlyModel(){
@重写公共DynamicManager资源getObject(){
DynamicImageResource dir=新的DynamicImageResource(){
@覆盖受保护字节[]getImageData(属性){
StringValue name=parameters.get(“name”);
byte[]imageBytes=null;
if(name.isEmpty()==false)
imageBytes=getImageAsBytes(name.toString());
返回imageBytes;
}
};
目录设置格式(“图像/png”);
返回目录;
}
}));
专用字节[]getImageAsBytes(字符串标签){
byte[]imageBytes=null;
试一试{
ByteArrayOutputStream outStream=新建ByteArrayOutputStream();
InputStream inStream=新文件InputStream(新文件(标签));
拷贝(流内、流外);
流内关闭();
exptream.close();
返回outStream.toByteArray();
}捕获(IOE异常){
e、 printStackTrace();
}
返回imageBytes;
}
私有无效副本(InputStream源、OutputStream目标)
抛出IOException
{
//将字节从源传输到目标
字节[]buf=新字节[1024];
内伦;
而((len=source.read(buf))>0){
写入(buf,0,len);
}
source.close();
destination.close();
}
最后,我在ItemOrderPanel.java中确定了这段代码
final ResourceReference imageResourceReference = new ImageResourceReference();
String imageName = itm.getProductImage();
final PageParameters parameters = new PageParameters();
parameters.set("name", imageName);
CharSequence urlForImage = getRequestCycle().urlFor(imageResourceReference,parameters);
ExternalLink link = new ExternalLink("link", urlForImage.toString());
link.setBody(Model.of(imageName));
add(link);
add(new NonCachingImage("img", new AbstractReadOnlyModel<DynamicImageResource>(){
@Override public DynamicImageResource getObject() {
DynamicImageResource dir = new DynamicImageResource() {
@Override protected byte[] getImageData(Attributes attributes) {
StringValue name = parameters.get("name");
byte[] imageBytes = null;
if(name.isEmpty() == false)
imageBytes = getImageAsBytes(name.toString());
return imageBytes;
}
};
dir.setFormat("image/png");
return dir;
}
}));
private byte[] getImageAsBytes(String label){
byte[] imageBytes = null;
try {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
InputStream inStream = new FileInputStream(new File(label));
copy(inStream, outStream);
inStream.close();
outStream.close();
return outStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return imageBytes;
}
private void copy(InputStream source, OutputStream destination)
throws IOException
{
// Transfer bytes from source to destination
byte[] buf = new byte[1024];
int len;
while ((len = source.read(buf)) > 0) {
destination.write(buf, 0, len);
}
source.close();
destination.close();
}
add(新的非机器图像(“img”),新的AbstractReadOnlyMo