首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在<h:graphicImage />中获取BufferedImage

如何在<h:graphicImage />中获取BufferedImage
EN

Stack Overflow用户
提问于 2013-05-17 23:23:21
回答 2查看 1.9K关注 0票数 2
代码语言:javascript
复制
byte [] imageInByte = event.getFile().getContents();
InputStream in = new ByteArrayInputStream(imageInByte);
try {
    BufferedImage bImageFromConvert = ImageIO.read(in);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我们是否可以将bImageFromConvert值带入<h:graphicImage />,或者在获得BufferedImage之前还有其他步骤才能在<h:graphicImage value="?"/>内部显示

EN

回答 2

Stack Overflow用户

发布于 2013-05-18 00:25:20

不幸的是,这里还没有通用的解决方案。但是通过检测ResourceHandler,你可以以官方的方式实现这一点(从JSF2开始):

代码语言:javascript
复制
public class TestResourceHandler extends ResourceHandlerWrapper {
    public static final class TestResource extends Resource {
        @Override
        public InputStream getInputStream() throws IOException {
            return null;
        }

        @Override
        public Map<String, String> getResponseHeaders() {
            return new HashMap<>();
        }

        @Override
        public String getRequestPath() {
            FacesContext context = FacesContext.getCurrentInstance();
            return context.getApplication().getViewHandler().getResourceURL(
                context, "/faces" + RESOURCE_IDENTIFIER + "/test.gif?ln=test");
        }

        @Override
        public URL getURL() {
            return null;
        }

        @Override
        public boolean userAgentNeedsUpdate(FacesContext context) {
            return true;
        }
    }

    private ResourceHandler wrapped;

    public TestResourceHandler(ResourceHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ResourceHandler getWrapped() {
        return wrapped;
    }

    @Override
    public Resource createResource(String resourceName, String libraryName) {
        if ("test".equals(libraryName))
            return new TestResource();
        return super.createResource(resourceName, libraryName);
    }

    @Override
    public boolean libraryExists(String libraryName) {
        if ("test".equals(libraryName))
            return true;
        return super.libraryExists(libraryName);
    }

    @Override
    public void handleResourceRequest(FacesContext context) throws IOException {
        String library = context.getExternalContext().getRequestParameterMap().get("ln");
        if ("test".equals(library)) {
            BufferedImage image = ImageIO.read(getClass().getResource("/info.png"));
            context.getExternalContext().setResponseContentType("image/gif");
            ImageIO.write(image, "gif", context.getExternalContext().getResponseOutputStream());
            context.responseComplete();
        } else {
            wrapped.handleResourceRequest(context);
        }
    }
}

并在faces-config.xml中注册:

代码语言:javascript
复制
<faces-config>
    <application>
        ...
        <resource-handler>com.intersult.test.util.TestResourceHandler</resource-handler>
    </application>
    ...
</faces-config>

通过/faces/javax.faces.resource/test.gif?ln=test或

该解决方案既可以在应用程序本身中工作,也可以在基础应用程序WAR中包含的任何JSF库中工作。

票数 0
EN

Stack Overflow用户

发布于 2016-06-21 16:27:36

另一种解决方法是使用Base64图像编码,例如采用以下方式:

代码语言:javascript
复制
byte[] imageBytes = Files.readAllBytes(myFile.toPath());
this.myImageBase64 = "data:" + contentType + ";base64," + DatatypeConverter.printBase64Binary(imageBytes);

(此代码需要Java 7)

然后在经典的超文本标记语言<img>标签上使用它:

代码语言:javascript
复制
<img src="${myBean.myImageBase64}" alt="" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16612681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档