从DAM调整CQ5图像大小

时间:2013-05-28 17:34:08

标签: cq5 dam

我希望从DAM调整图像大小,我的图像路径存储在直接链接到DAM资产的路径域中。 图像是“/content/dam/....jpg”; 我可以访问DAM路径,我需要调整此图像的大小并使用选择器显示。 我使用基础图像组件尝试了代码,它对我不起作用。

 Resource rsc = resourceResolver.getResource(image);
                    Image img3 = new Image(rsc);

                    img3.setSrc(img3.getPath());
                    img3.setSelector(".myselector");
                    img3.setFileReference(image);

                    img3.draw(out);

1 个答案:

答案 0 :(得分:1)

如果要使用选择器,则需要为其扩展AbstractImageServlet创建一个servlet。你会从这样的事情开始:

@Component
@Service
@Properties({
      @Property(name="sling.servlet.resourceTypes", value="sling/servlet/default"),
      @Property(name="sling.servlet.selectors", value="resize"),
      @Property(name="sling.servlet.extensions", value={"jpg", "png", "gif"}),
      @Property(name="sling.servlet.methods", value="GET")
})

public class ImageResizeServlet extends AbstractImageServlet {
//... code.
}

sling.servlet.selectors将是您想要设置的选择器名称。例如:

//in the servlet
@Property(name="sling.servlet.selectors", value="resize")

//in the jsp
image.setSelector("resize");

在您的课程中,您可能希望覆盖writeLayer方法。像这样:

@Override
protected void writeLayer(SlingHttpServletRequest req,
                          SlingHttpServletResponse resp,
                          AbstractImageServlet.ImageContext c, Layer layer)
        throws IOException, RepositoryException {
    // set new width and height    
    int width = 100;
    int height = 100;

    Image image = new Image(c.resource);
    if (!image.hasContent() || width == 0) {
        resp.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }

    // get style and set constraints
    image.loadStyleData(c.style);

    // get pure layer
    layer = image.getLayer(true, true, true);

    Layer newLayer = ImageHelper.resize(layer, new Dimension(width, 0), null, null);
    if (newLayer != null) {
        layer = newLayer;
    }

    String mimeType = image.getMimeType();
    if (ImageHelper.getExtensionFromType(mimeType) == null) {
        // get default mime type
        mimeType = "image/png";
    }
    resp.setContentType(mimeType);

    layer.write(mimeType, mimeType.equals("image/gif") ? 255 : 1.0, resp.getOutputStream());

    resp.flushBuffer();
}

在我们的自定义解决方案中,我们处理了writeLayer方法中的所有内容,而不是createLayer方法。所以我们覆盖了createLayer。

@Override
protected Layer createLayer(AbstractImageServlet.ImageContext c)
        throws RepositoryException, IOException {
    // don't create the layer yet. handle everything later
    return null;
}

我们还覆盖了createImageResource

/**
 * {@inheritDoc}
 *
 * Override default ImageResource creation to support assets
 */
@Override
protected ImageResource createImageResource(Resource resource) {
    return new Image(resource);
}

希望有所帮助。