mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							54 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							54 lines
						
					
					
						
							1.5 KiB
						
					
					
				function cropCanvasAndExportToPNG (canvas, { errorOnTooSmall } = { errorOnTooSmall: false }) {
 | 
						|
  const ctx = canvas.getContext('2d')
 | 
						|
 | 
						|
  const width = canvas.width
 | 
						|
  const height = canvas.height
 | 
						|
 | 
						|
  let topmost = height
 | 
						|
  let bottommost = 0
 | 
						|
  let leftmost = width
 | 
						|
  let rightmost = 0
 | 
						|
 | 
						|
  const imageData = ctx.getImageData(0, 0, width, height)
 | 
						|
  const pixels = imageData.data
 | 
						|
 | 
						|
  for (let y = 0; y < height; y++) {
 | 
						|
    for (let x = 0; x < width; x++) {
 | 
						|
      const pixelIndex = (y * width + x) * 4
 | 
						|
      const alpha = pixels[pixelIndex + 3]
 | 
						|
      if (alpha !== 0) {
 | 
						|
        topmost = Math.min(topmost, y)
 | 
						|
        bottommost = Math.max(bottommost, y)
 | 
						|
        leftmost = Math.min(leftmost, x)
 | 
						|
        rightmost = Math.max(rightmost, x)
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const croppedWidth = rightmost - leftmost + 1
 | 
						|
  const croppedHeight = bottommost - topmost + 1
 | 
						|
 | 
						|
  const croppedCanvas = document.createElement('canvas')
 | 
						|
  croppedCanvas.width = croppedWidth
 | 
						|
  croppedCanvas.height = croppedHeight
 | 
						|
  const croppedCtx = croppedCanvas.getContext('2d')
 | 
						|
 | 
						|
  if (errorOnTooSmall && (croppedWidth < 20 || croppedHeight < 20)) {
 | 
						|
    return Promise.reject(new Error('Image too small'))
 | 
						|
  }
 | 
						|
 | 
						|
  croppedCtx.drawImage(canvas, leftmost, topmost, croppedWidth, croppedHeight, 0, 0, croppedWidth, croppedHeight)
 | 
						|
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    croppedCanvas.toBlob((blob) => {
 | 
						|
      if (blob) {
 | 
						|
        resolve(blob)
 | 
						|
      } else {
 | 
						|
        reject(new Error('Failed to create a PNG blob.'))
 | 
						|
      }
 | 
						|
    }, 'image/png')
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
export { cropCanvasAndExportToPNG }
 |