Asset Management | Community
Skip to main content
Level 2
February 6, 2024
Solved

Asset Management

  • February 6, 2024
  • 3 replies
  • 676 views

How to crop image programmatically using ImageHelper.getCropRect()? Can anyone provide me documentation or sample code for reference?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by TarunKumar

Hi @neha_jadhav ,

You can try to use  ImageHelper.createLayer(dataResource) for layer creation:

Sample code you can check below:

private void cropCad(final Asset asset, final ResourceResolver resolver, final long cropValue) throws WorkflowException { if (asset == null) { LOG.debug("Cad asset is null"); return; } final Resource dataResource = asset.getOriginal().getChild(JcrConstants.JCR_CONTENT); final Layer layer = ImageHelper.createLayer(dataResource); String cropRatios = StringUtils.EMPTY; if (asset.getMetadata() != null) { long heightinDec = 0L; long widthinDec = 0L; if (asset.getMetadata(DamConstants.TIFF_IMAGELENGTH) != null) { heightinDec = (long) asset.getMetadata(DamConstants.TIFF_IMAGELENGTH); } if (asset.getMetadata(DamConstants.TIFF_IMAGEWIDTH) != null) { widthinDec = (long) asset.getMetadata(DamConstants.TIFF_IMAGEWIDTH); } cropRatios = new StringBuilder(Long.toString(0L)).append(",").append(Long.toString(0L)) .append(",").append(Long.toString(widthinDec)).append(",") .append(Long.toString(heightinDec - cropValue)).toString(); } final Rectangle rect = ImageHelper.getCropRect(cropRatios, asset.getPath()); layer.crop(rect); OutputStream out = null; InputStream in = null; final String mimeType = StandardImageHandler.PNG1_MIMETYPE; File file = null; try { final String tempFilePrefix = "cropped-" + asset.getName(); file = File.createTempFile(tempFilePrefix, ".tmp"); out = FileUtils.openOutputStream(file); layer.write(mimeType, 1.0, out); in = FileUtils.openInputStream(file); final Map<String, Object> map = new HashMap<>(); map.put(RenditionHandler.PROPERTY_RENDITION_MIME_TYPE, mimeType); try { final Revision stateId = asset.createRevision( asset.getName() + Calendar.getInstance().getTimeInMillis(), "Asset backup revision"); asset.removeRendition("original"); if (asset.getOriginal() != null) { LOG.info("Original Not Removed2!!!"); } else { LOG.info("Original is Removed2!!!"); } asset.addRendition("original", in, map); final Rendition croppedOriginal = asset.getOriginal(); if (croppedOriginal != null) { LOG.debug("Original Exists!!! {}", croppedOriginal.getPath()); } else { LOG.info("Cropped original unavailable. Trying to restore to the previous original. {}", asset.getPath()); asset.restore(stateId.getId()); throw new WorkflowException("Error 1 occurred while cropping and setting the rendition"); } } catch (final Exception e) { LOG.error("Error in Adding Original", e); throw new WorkflowException("Error 2 occurred while cropping and setting the rendition"); } } catch (final IOException e) { LOG.error("Error while cropping an outfit image", e); throw new WorkflowException("Error 3 occurred while cropping and setting the rendition"); } finally { if (null != file && !file.delete()) { LOG.warn("Temporary file cannot be deleted or it's null"); } IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); } }

 

 

Thanks
Tarun

 

3 replies

Kamal_Kishor
Community Advisor
Community Advisor
February 6, 2024
SureshDhulipudi
Community Advisor
Community Advisor
February 6, 2024

public Layer cropImage(Asset asset, Session session, int x, int y, int width, int height) {
Rendition original = asset.getOriginal();
Layer layer = null;

if (original != null) {
try {
layer = new Layer(original.getStream());
Rectangle rect = new Rectangle(x, y, width, height);
layer.crop(rect);
} catch (Exception e) {
// handle exception
}
}

return layer;
}

 

Please replace the x, y, width, and height parameters with the actual values for your crop area.

TarunKumar
Community Advisor
TarunKumarCommunity AdvisorAccepted solution
Community Advisor
February 7, 2024

Hi @neha_jadhav ,

You can try to use  ImageHelper.createLayer(dataResource) for layer creation:

Sample code you can check below:

private void cropCad(final Asset asset, final ResourceResolver resolver, final long cropValue) throws WorkflowException { if (asset == null) { LOG.debug("Cad asset is null"); return; } final Resource dataResource = asset.getOriginal().getChild(JcrConstants.JCR_CONTENT); final Layer layer = ImageHelper.createLayer(dataResource); String cropRatios = StringUtils.EMPTY; if (asset.getMetadata() != null) { long heightinDec = 0L; long widthinDec = 0L; if (asset.getMetadata(DamConstants.TIFF_IMAGELENGTH) != null) { heightinDec = (long) asset.getMetadata(DamConstants.TIFF_IMAGELENGTH); } if (asset.getMetadata(DamConstants.TIFF_IMAGEWIDTH) != null) { widthinDec = (long) asset.getMetadata(DamConstants.TIFF_IMAGEWIDTH); } cropRatios = new StringBuilder(Long.toString(0L)).append(",").append(Long.toString(0L)) .append(",").append(Long.toString(widthinDec)).append(",") .append(Long.toString(heightinDec - cropValue)).toString(); } final Rectangle rect = ImageHelper.getCropRect(cropRatios, asset.getPath()); layer.crop(rect); OutputStream out = null; InputStream in = null; final String mimeType = StandardImageHandler.PNG1_MIMETYPE; File file = null; try { final String tempFilePrefix = "cropped-" + asset.getName(); file = File.createTempFile(tempFilePrefix, ".tmp"); out = FileUtils.openOutputStream(file); layer.write(mimeType, 1.0, out); in = FileUtils.openInputStream(file); final Map<String, Object> map = new HashMap<>(); map.put(RenditionHandler.PROPERTY_RENDITION_MIME_TYPE, mimeType); try { final Revision stateId = asset.createRevision( asset.getName() + Calendar.getInstance().getTimeInMillis(), "Asset backup revision"); asset.removeRendition("original"); if (asset.getOriginal() != null) { LOG.info("Original Not Removed2!!!"); } else { LOG.info("Original is Removed2!!!"); } asset.addRendition("original", in, map); final Rendition croppedOriginal = asset.getOriginal(); if (croppedOriginal != null) { LOG.debug("Original Exists!!! {}", croppedOriginal.getPath()); } else { LOG.info("Cropped original unavailable. Trying to restore to the previous original. {}", asset.getPath()); asset.restore(stateId.getId()); throw new WorkflowException("Error 1 occurred while cropping and setting the rendition"); } } catch (final Exception e) { LOG.error("Error in Adding Original", e); throw new WorkflowException("Error 2 occurred while cropping and setting the rendition"); } } catch (final IOException e) { LOG.error("Error while cropping an outfit image", e); throw new WorkflowException("Error 3 occurred while cropping and setting the rendition"); } finally { if (null != file && !file.delete()) { LOG.warn("Temporary file cannot be deleted or it's null"); } IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); } }

 

 

Thanks
Tarun