从DAM调整CQ5图像的大小
问题描述:
我正在寻找调整DAM大小的图像的大小,我的图像路径存储在pathclty中,这个direclty链接到DAM资产。 图像是“/content/dam/....jpg”; 我有权访问DAM路径,我需要使用选择器调整大小并显示此图像。 我试过使用基础图像组件的代码,它不适合我。从DAM调整CQ5图像的大小
Resource rsc = resourceResolver.getResource(image);
Image img3 = new Image(rsc);
img3.setSrc(img3.getPath());
img3.setSelector(".myselector");
img3.setFileReference(image);
img3.draw(out);
答
如果你想使用选择器,你需要为它创建一个servlet,它扩展了AbstractImageServlet。你会在开始时是这样的:
@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);
}
希望有所帮助。
嗨Woodifier,感谢您的回应。我在Java类中获取资源为null,可能会错过某些东西。在调用选择器类之前,需要在jsp中设置哪些东西。我很感激,如果你让我知道一些例子。 – user1130906
你的代码对于jsp来说看起来不错。您只需将选择器更改为您定义的选择器即可。我从最近的一个项目中抽取了上面的代码。我在上面添加了一些应该能正常工作的东西。 – Woodifer
以下是一个附加示例:http://balawcm.wordpress.com/2012/11/14/develop-a-custom-cq-selector/此人只覆盖createLayer方法。 – Woodifer