Initial commit
This commit is contained in:
commit
e49726988c
5445 files changed
+1089914
No files matched your search
+102
@@ -0,0 +1,102 @@
|
||||
import { JimpClass } from "@jimp/types";
|
||||
import { z } from "zod";
|
||||
export declare const CropOptionsSchema: z.ZodObject<{
|
||||
/** the x position to crop form */
|
||||
x: z.ZodNumber;
|
||||
/** the y position to crop form */
|
||||
y: z.ZodNumber;
|
||||
/** the width to crop form */
|
||||
w: z.ZodNumber;
|
||||
/** the height to crop form */
|
||||
h: z.ZodNumber;
|
||||
}, "strip", z.ZodTypeAny, {
|
||||
x: number;
|
||||
y: number;
|
||||
w: number;
|
||||
h: number;
|
||||
}, {
|
||||
x: number;
|
||||
y: number;
|
||||
w: number;
|
||||
h: number;
|
||||
}>;
|
||||
export type CropOptions = z.infer<typeof CropOptionsSchema>;
|
||||
declare const AutocropComplexOptionsSchema: z.ZodObject<{
|
||||
/** percent of color difference tolerance (default value) */
|
||||
tolerance: z.ZodOptional<z.ZodNumber>;
|
||||
/** flag to force cropping only if the image has a real "frame" i.e. all 4 sides have some border (default value) */
|
||||
cropOnlyFrames: z.ZodOptional<z.ZodBoolean>;
|
||||
/** force cropping top be symmetric */
|
||||
cropSymmetric: z.ZodOptional<z.ZodBoolean>;
|
||||
/** Amount of pixels in border to leave */
|
||||
leaveBorder: z.ZodOptional<z.ZodNumber>;
|
||||
ignoreSides: z.ZodOptional<z.ZodObject<{
|
||||
north: z.ZodOptional<z.ZodBoolean>;
|
||||
south: z.ZodOptional<z.ZodBoolean>;
|
||||
east: z.ZodOptional<z.ZodBoolean>;
|
||||
west: z.ZodOptional<z.ZodBoolean>;
|
||||
}, "strip", z.ZodTypeAny, {
|
||||
north?: boolean | undefined;
|
||||
south?: boolean | undefined;
|
||||
east?: boolean | undefined;
|
||||
west?: boolean | undefined;
|
||||
}, {
|
||||
north?: boolean | undefined;
|
||||
south?: boolean | undefined;
|
||||
east?: boolean | undefined;
|
||||
west?: boolean | undefined;
|
||||
}>>;
|
||||
}, "strip", z.ZodTypeAny, {
|
||||
tolerance?: number | undefined;
|
||||
cropOnlyFrames?: boolean | undefined;
|
||||
cropSymmetric?: boolean | undefined;
|
||||
leaveBorder?: number | undefined;
|
||||
ignoreSides?: {
|
||||
north?: boolean | undefined;
|
||||
south?: boolean | undefined;
|
||||
east?: boolean | undefined;
|
||||
west?: boolean | undefined;
|
||||
} | undefined;
|
||||
}, {
|
||||
tolerance?: number | undefined;
|
||||
cropOnlyFrames?: boolean | undefined;
|
||||
cropSymmetric?: boolean | undefined;
|
||||
leaveBorder?: number | undefined;
|
||||
ignoreSides?: {
|
||||
north?: boolean | undefined;
|
||||
south?: boolean | undefined;
|
||||
east?: boolean | undefined;
|
||||
west?: boolean | undefined;
|
||||
} | undefined;
|
||||
}>;
|
||||
export type AutocropComplexOptions = z.infer<typeof AutocropComplexOptionsSchema>;
|
||||
export type AutocropOptions = number | AutocropComplexOptions;
|
||||
export declare const methods: {
|
||||
/**
|
||||
* Crops the image at a given point to a give size.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
* const cropped = image.crop(150, 100);
|
||||
* ```
|
||||
*/
|
||||
crop<I extends JimpClass>(image: I, options: CropOptions): I;
|
||||
/**
|
||||
* Autocrop same color borders from this image.
|
||||
* This function will attempt to crop out transparent pixels from the image.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
* const cropped = image.autocrop();
|
||||
* ```
|
||||
*/
|
||||
autocrop<I extends JimpClass>(image: I, options?: AutocropOptions): I;
|
||||
};
|
||||
export {};
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;IAC5B,kCAAkC;;IAElC,kCAAkC;;IAElC,6BAA6B;;IAE7B,8BAA8B;;;;;;;;;;;;EAE9B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,QAAA,MAAM,4BAA4B;IAChC,4DAA4D;;IAE5D,oHAAoH;;IAEpH,sCAAsC;;IAEtC,0CAA0C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU1C,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAC1C,OAAO,4BAA4B,CACpC,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,sBAAsB,CAAC;AAE9D,eAAO,MAAM,OAAO;IAClB;;;;;;;;;;OAUG;SACE,CAAC,SAAS,SAAS,SAAS,CAAC,WAAW,WAAW;IAiCxD;;;;;;;;;;;OAWG;aACM,CAAC,SAAS,SAAS,SAAS,CAAC,YAAW,eAAe;CAqLjE,CAAC"}
|
||||
+226
@@ -0,0 +1,226 @@
|
||||
import { colorDiff, intToRGBA, scan } from "@jimp/utils";
|
||||
import { z } from "zod";
|
||||
export const CropOptionsSchema = z.object({
|
||||
/** the x position to crop form */
|
||||
x: z.number(),
|
||||
/** the y position to crop form */
|
||||
y: z.number(),
|
||||
/** the width to crop form */
|
||||
w: z.number(),
|
||||
/** the height to crop form */
|
||||
h: z.number(),
|
||||
});
|
||||
const AutocropComplexOptionsSchema = z.object({
|
||||
/** percent of color difference tolerance (default value) */
|
||||
tolerance: z.number().min(0).max(1).optional(),
|
||||
/** flag to force cropping only if the image has a real "frame" i.e. all 4 sides have some border (default value) */
|
||||
cropOnlyFrames: z.boolean().optional(),
|
||||
/** force cropping top be symmetric */
|
||||
cropSymmetric: z.boolean().optional(),
|
||||
/** Amount of pixels in border to leave */
|
||||
leaveBorder: z.number().optional(),
|
||||
ignoreSides: z
|
||||
.object({
|
||||
north: z.boolean().optional(),
|
||||
south: z.boolean().optional(),
|
||||
east: z.boolean().optional(),
|
||||
west: z.boolean().optional(),
|
||||
})
|
||||
.optional(),
|
||||
});
|
||||
export const methods = {
|
||||
/**
|
||||
* Crops the image at a given point to a give size.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
* const cropped = image.crop(150, 100);
|
||||
* ```
|
||||
*/
|
||||
crop(image, options) {
|
||||
let { x, y, w, h } = CropOptionsSchema.parse(options);
|
||||
// round input
|
||||
x = Math.round(x);
|
||||
y = Math.round(y);
|
||||
w = Math.round(w);
|
||||
h = Math.round(h);
|
||||
if (x === 0 && w === image.bitmap.width) {
|
||||
// shortcut
|
||||
const start = (w * y + x) << 2;
|
||||
const end = start + ((h * w) << 2);
|
||||
image.bitmap.data = image.bitmap.data.slice(start, end);
|
||||
}
|
||||
else {
|
||||
const bitmap = Buffer.allocUnsafe(w * h * 4);
|
||||
let offset = 0;
|
||||
scan(image, x, y, w, h, function (_, __, idx) {
|
||||
const data = image.bitmap.data.readUInt32BE(idx);
|
||||
bitmap.writeUInt32BE(data, offset);
|
||||
offset += 4;
|
||||
});
|
||||
image.bitmap.data = bitmap;
|
||||
}
|
||||
image.bitmap.width = w;
|
||||
image.bitmap.height = h;
|
||||
return image;
|
||||
},
|
||||
/**
|
||||
* Autocrop same color borders from this image.
|
||||
* This function will attempt to crop out transparent pixels from the image.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
* const cropped = image.autocrop();
|
||||
* ```
|
||||
*/
|
||||
autocrop(image, options = {}) {
|
||||
const { tolerance = 0.0002, cropOnlyFrames = true, cropSymmetric = false, leaveBorder = 0, ignoreSides: ignoreSidesArg, } = typeof options === "number"
|
||||
? { tolerance: options }
|
||||
: AutocropComplexOptionsSchema.parse(options);
|
||||
const w = image.bitmap.width;
|
||||
const h = image.bitmap.height;
|
||||
const minPixelsPerSide = 1; // to avoid cropping completely the image, resulting in an invalid 0 sized image
|
||||
// i.e. north and south / east and west are cropped by the same value
|
||||
const ignoreSides = {
|
||||
north: false,
|
||||
south: false,
|
||||
east: false,
|
||||
west: false,
|
||||
...ignoreSidesArg,
|
||||
};
|
||||
/**
|
||||
* All borders must be of the same color as the top left pixel, to be cropped.
|
||||
* It should be possible to crop borders each with a different color,
|
||||
* but since there are many ways for corners to intersect, it would
|
||||
* introduce unnecessary complexity to the algorithm.
|
||||
*/
|
||||
// scan each side for same color borders
|
||||
let colorTarget = image.getPixelColor(0, 0); // top left pixel color is the target color
|
||||
const rgba1 = intToRGBA(colorTarget);
|
||||
// for north and east sides
|
||||
let northPixelsToCrop = 0;
|
||||
let eastPixelsToCrop = 0;
|
||||
let southPixelsToCrop = 0;
|
||||
let westPixelsToCrop = 0;
|
||||
// north side (scan rows from north to south)
|
||||
colorTarget = image.getPixelColor(0, 0);
|
||||
if (!ignoreSides.north) {
|
||||
north: for (let y = 0; y < h - minPixelsPerSide; y++) {
|
||||
for (let x = 0; x < w; x++) {
|
||||
const colorXY = image.getPixelColor(x, y);
|
||||
const rgba2 = intToRGBA(colorXY);
|
||||
if (colorDiff(rgba1, rgba2) > tolerance) {
|
||||
// this pixel is too distant from the first one: abort this side scan
|
||||
break north;
|
||||
}
|
||||
}
|
||||
// this row contains all pixels with the same color: increment this side pixels to crop
|
||||
northPixelsToCrop++;
|
||||
}
|
||||
}
|
||||
// west side (scan columns from west to east)
|
||||
colorTarget = image.getPixelColor(w, 0);
|
||||
if (!ignoreSides.west) {
|
||||
west: for (let x = 0; x < w - minPixelsPerSide; x++) {
|
||||
for (let y = 0 + northPixelsToCrop; y < h; y++) {
|
||||
const colorXY = image.getPixelColor(x, y);
|
||||
const rgba2 = intToRGBA(colorXY);
|
||||
if (colorDiff(rgba1, rgba2) > tolerance) {
|
||||
// this pixel is too distant from the first one: abort this side scan
|
||||
break west;
|
||||
}
|
||||
}
|
||||
// this column contains all pixels with the same color: increment this side pixels to crop
|
||||
westPixelsToCrop++;
|
||||
}
|
||||
}
|
||||
// south side (scan rows from south to north)
|
||||
colorTarget = image.getPixelColor(0, h);
|
||||
if (!ignoreSides.south) {
|
||||
south: for (let y = h - 1; y >= northPixelsToCrop + minPixelsPerSide; y--) {
|
||||
for (let x = w - eastPixelsToCrop - 1; x >= 0; x--) {
|
||||
const colorXY = image.getPixelColor(x, y);
|
||||
const rgba2 = intToRGBA(colorXY);
|
||||
if (colorDiff(rgba1, rgba2) > tolerance) {
|
||||
// this pixel is too distant from the first one: abort this side scan
|
||||
break south;
|
||||
}
|
||||
}
|
||||
// this row contains all pixels with the same color: increment this side pixels to crop
|
||||
southPixelsToCrop++;
|
||||
}
|
||||
}
|
||||
// east side (scan columns from east to west)
|
||||
colorTarget = image.getPixelColor(w, h);
|
||||
if (!ignoreSides.east) {
|
||||
east: for (let x = w - 1; x >= 0 + westPixelsToCrop + minPixelsPerSide; x--) {
|
||||
for (let y = h - 1; y >= 0 + northPixelsToCrop; y--) {
|
||||
const colorXY = image.getPixelColor(x, y);
|
||||
const rgba2 = intToRGBA(colorXY);
|
||||
if (colorDiff(rgba1, rgba2) > tolerance) {
|
||||
// this pixel is too distant from the first one: abort this side scan
|
||||
break east;
|
||||
}
|
||||
}
|
||||
// this column contains all pixels with the same color: increment this side pixels to crop
|
||||
eastPixelsToCrop++;
|
||||
}
|
||||
}
|
||||
// decide if a crop is needed
|
||||
let doCrop = false;
|
||||
// apply leaveBorder
|
||||
westPixelsToCrop -= leaveBorder;
|
||||
eastPixelsToCrop -= leaveBorder;
|
||||
northPixelsToCrop -= leaveBorder;
|
||||
southPixelsToCrop -= leaveBorder;
|
||||
if (cropSymmetric) {
|
||||
const horizontal = Math.min(eastPixelsToCrop, westPixelsToCrop);
|
||||
const vertical = Math.min(northPixelsToCrop, southPixelsToCrop);
|
||||
westPixelsToCrop = horizontal;
|
||||
eastPixelsToCrop = horizontal;
|
||||
northPixelsToCrop = vertical;
|
||||
southPixelsToCrop = vertical;
|
||||
}
|
||||
// make sure that crops are >= 0
|
||||
westPixelsToCrop = westPixelsToCrop >= 0 ? westPixelsToCrop : 0;
|
||||
eastPixelsToCrop = eastPixelsToCrop >= 0 ? eastPixelsToCrop : 0;
|
||||
northPixelsToCrop = northPixelsToCrop >= 0 ? northPixelsToCrop : 0;
|
||||
southPixelsToCrop = southPixelsToCrop >= 0 ? southPixelsToCrop : 0;
|
||||
// safety checks
|
||||
const widthOfRemainingPixels = w - (westPixelsToCrop + eastPixelsToCrop);
|
||||
const heightOfRemainingPixels = h - (southPixelsToCrop + northPixelsToCrop);
|
||||
if (cropOnlyFrames) {
|
||||
// crop image if all sides should be cropped
|
||||
doCrop =
|
||||
eastPixelsToCrop !== 0 &&
|
||||
northPixelsToCrop !== 0 &&
|
||||
westPixelsToCrop !== 0 &&
|
||||
southPixelsToCrop !== 0;
|
||||
}
|
||||
else {
|
||||
// crop image if at least one side should be cropped
|
||||
doCrop =
|
||||
eastPixelsToCrop !== 0 ||
|
||||
northPixelsToCrop !== 0 ||
|
||||
westPixelsToCrop !== 0 ||
|
||||
southPixelsToCrop !== 0;
|
||||
}
|
||||
if (doCrop) {
|
||||
// do the real crop
|
||||
this.crop(image, {
|
||||
x: westPixelsToCrop,
|
||||
y: northPixelsToCrop,
|
||||
w: widthOfRemainingPixels,
|
||||
h: heightOfRemainingPixels,
|
||||
});
|
||||
}
|
||||
return image;
|
||||
},
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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 truncated
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"type": "module"
|
||||
}
|
||||
Reference in new issue
Block a user