Security News
38% of CISOs Fear They’re Not Moving Fast Enough on AI
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
scale-crop-rotate
Advanced tools
import scaleCropRotate, { imageDataToDataURL, URLToImageData } from 'scale-crop-rotate';
const progress = document.getElementsByTagName('progress')[0];
const resizeImage = async (imageURL, width, height) => {
try {
const data = await URLToImageData(imageURL);
const resultData = await scaleCropRotate(data, width, height)
.progress(value => {
progress.value = value;
});
const image = new Image;
image.src = imageDataToDataURL(resultData);
document.body.append(image);
}
catch(e) {
console.error(e);
}
}
resizeImage(
'/assets/beautiful-landscape.jpg',
384,
190
);
Image processing is an intensive CPU time consumption job. The data is processed in a very big loop inside the same Event loop iteration and, done in browser, may cause significant UI hickups. The solution may be to perform image processing in other thread with the help of the WebWorker. However it is possible to avoid blocking the UI thread by performing the work in range of many Event loop iterations.
This function reserves 10ms of every Event loop iteration to process data.
This function uses the technique, proposed by Paul Rouget in his article about pixel manipulation with Typed Arrays. His method reduces the number of read/write operations to the ArrayBuffer
of the ImageData
returned by the CanvasRenderingContext2D.getImageData()
method. It saves the overall processing time when iterating through every pixel in the image.
The usage of Math
is avoided in favour of Bitwise operators, giving a significant boost in performance in some browsers.
To save even more memory and time, scaling, cropping and rotating operations are performed in scope of the same loop.
npm i scale-crop-rotate
or
yarn add scale-crop-rotate
scaleCropRotate(source[, width, height[, cropX, cropY, cropWidth, cropHeight[, rotate[, enableSyncMode]]]]);
scaleCropRotate(source[, width, height[, rotate[, enableSyncMode]]]);
scaleCropRotate(source[, cropX, cropY, cropWidth, cropHeight[, rotate[, enableSyncMode]]]);
scaleCropRotate(source[, rotate[, enableSyncMode]]);
The source image data, should be an instance of the ImageData
.
A Number
indicating width of the resulting image. If the value is 0
, the width is adapted to keep the same aspect ratio as in the source image.
A Number
indicating height of the resulting image. If the value is 0
, the height is adapted to keep the same aspect ratio as in the source image.
A Number
indicating distance from the left side of the source image to draw into the destination context. This allows to crop the source image from the left side. The default value is calculated to position the cropping area in center of the source image.
A Number
indicating distance from the top side of the source image to draw into the destination context. This allows to crop the source image from the top side. The default value is calculated to position the cropping area in center of the source image.
A Number
indicating the width of the area that will be transfered from the source image to the destination image. The default value is calculated to position the cropping area in center of the source image.
A Number
indicating the height of the area that will be transfered from the source image to the destination image. The default value is calculated to position the cropping area in center of the source image.
A Number
representing the Exif Orientation Tag, or a DOMString
containig one of predefined rotation values: 90deg
, 180deg
, 270deg
, horizontal
, vertical
. Last two predefined values allow to mirror image horizontally and vertically.
A Boolean
switch forces function to work in syncronous mode. In this case funcion overall execution time is faster, but it blocks the UI.
A Promise
that resolves with an ImageData
containing the resulting image. A Promise
is extended with the .progress()
method that recieves a function
as an argument to handle the image processing progress.
An ImageData
containing the resulting image.
To retrieve an ImageData
out of different conventional data sources, use these functions:
Retrieves an ImageData
from a Blob
object.
scaleCropRotate.blobToImageData(object);
A Blob
object to retrieve an ImageData
from.
A Promise
that resolves with an ImageData
.
Converts an ImageData
to a Blob
object.
scaleCropRotate.imageDataToBlob(object);
An ImageData
object to convert to a Blob
object.
A Promise
that resolves with a Blob
object.
Converts an ImageData
to a data URI string.
scaleCropRotate.imageDataToDataURL(object);
An ImageData
object to convert to a data URI.
A DOMString
containing the processed data URI.
Retrieves an ImageData
from HTMLImageElement
object.
scaleCropRotate.imageToImageData(object);
An HTMLImageElement
object to retrieve an ImageData
from.
A Promise
that resolves with an ImageData
.
Loads an image from the given URI and retrieves an ImageData
.
scaleCropRotate.URLToImageData(URIString);
A DOMString
containing the URI linking to the image to retrieve an ImageData
from.
A Promise
that resolves with an ImageData
.
Check other great libraries to do in-browser image resizing:
MIT
FAQs
Scale, crop and rotate images, not blocking UI.
The npm package scale-crop-rotate receives a total of 0 weekly downloads. As such, scale-crop-rotate popularity was classified as not popular.
We found that scale-crop-rotate demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Research
Security News
Socket researchers uncovered a backdoored typosquat of BoltDB in the Go ecosystem, exploiting Go Module Proxy caching to persist undetected for years.
Security News
Company News
Socket is joining TC54 to help develop standards for software supply chain security, contributing to the evolution of SBOMs, CycloneDX, and Package URL specifications.