从DAM调整CQ5图像的大小

从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); 
} 

希望有所帮助。

+0

嗨Woodifier,感谢您的回应。我在Java类中获取资源为null,可能会错过某些东西。在调用选择器类之前,需要在jsp中设置哪些东西。我很感激,如果你让我知道一些例子。 – user1130906

+0

你的代码对于jsp来说看起来不错。您只需将选择器更改为您定义的选择器即可。我从最近的一个项目中抽取了上面的代码。我在上面添加了一些应该能正常工作的东西。 – Woodifer

+0

以下是一个附加示例:http://balawcm.wordpress.com/2012/11/14/develop-a-custom-cq-selector/此人只覆盖createLayer方法。 – Woodifer