trustwallet-assets/script/common/image.ts
Adam R 079617ac38
[Internal] Refactored fix builds (#2920)
* Empty infrastructure for new-housekeeping build.

* Move updateBEP action to new new-housekeeping build infra.

* Remove old updateBEP.

* New-housekeeping-dryrun run.

* Include new top-level folder name script-new.

* Remove update:bep2 from old daily-run.

* Use imports instead of require.

* Small refactor for testability.

* Organize scripts into subfolders.

* iUpdateBEP2: refactor and add tests.

* Move formatting validators to new-housekeeping,add new helpers.

* Move info and black/whitelist fixing to new-housekeeping.

* New fix command.

* New 'fix' target; Move ETH checksum fix to new-housekeeping.

* Move logo size check and resize to new-housekeeping.

* Improved async error handling.

* Build renames.

* Move (old) BEP2 and CMC update to periodic update build.

* Rename (add missing).

* Rename builds.

* Renames ('fix').

* rename

* Invoke new scripts (as well) from period-update.

* Move cmc update to new-periodic.

* Move tezos validator update to new-periodic.

* Missing file.

* Leftover.

* Cleanup

* Rename of unused openseacontracts.

* CMC should not be run always.

* Break main/fixAndUpdate function into two.

* Show diff in build after changes.

* Cleanup

* Rename, script-old.

* Cleanup, remove old fix build definitions.

* Renames, remove new- prefix.

* CMC mapping update.

* Config infrastructure; add binance URL to config.

* Add image size parameters to config.

* Rename.

Co-authored-by: Catenocrypt <catenocrypt@users.noreply.github.com>
Co-authored-by: Andrew M <35627271+zachzwei@users.noreply.github.com>
2020-07-29 15:42:51 +02:00

74 lines
2.7 KiB
TypeScript

import * as sharp from "sharp";
import * as tinify from "tinify";
import * as image_size from "image-size";
import {
writeFileSync,
getFileSizeInKilobyte
} from "./filesystem";
import * as chalk from 'chalk';
import * as config from "../common/config";
//export const minLogoWidth = 64;
//export const minLogoHeight = 64;
export const maxLogoWidth = config.getConfig("image_max_logo_width", 512);
export const maxLogoHeight = config.getConfig("image_max_logo_height", 512);
export const maxLogoSizeInKilobyte = config.getConfig("image_logo_size_kb", 100);
export function isDimensionTooLarge(width: number, height: number): boolean {
return (width > maxLogoWidth) || (height > maxLogoHeight);
}
export function calculateTargetSize(srcWidth: number, srcHeight: number, targetWidth: number, targetHeight: number): {width: number, height: number} {
if (srcWidth == 0 || srcHeight == 0) {
return {width: targetWidth, height: targetHeight};
}
const ratio = Math.min(targetWidth / srcWidth, targetHeight / srcHeight);
return {
width: Math.round(srcWidth * ratio),
height: Math.round(srcHeight * ratio)
};
}
const getImageDimensions = (path: string) => image_size.imageSize(path);
async function compressTinyPNG(path: string) {
console.log(`Compressing image via tinypng at path ${path}`);
const source = await tinify.fromFile(path);
await source.toFile(path);
}
// return true if image updated
export async function resizeIfTooLarge(path: string): Promise<boolean> {
let updated: boolean = false;
const { width: srcWidth, height: srcHeight } = getImageDimensions(path);
if (isDimensionTooLarge(srcWidth, srcHeight)) {
const { width, height } = calculateTargetSize(srcWidth, srcHeight, maxLogoWidth, maxLogoHeight);
console.log(`Resizing image at ${path} from ${srcWidth}x${srcHeight} => ${width}x${height}`)
await sharp(path).resize(width, height).toBuffer()
.then(data => {
writeFileSync(path, data);
updated = true;
})
.catch(e => {
console.log(chalk.red(e.message));
});
}
// If file size > max limit, compress with tinypng
const sizeKilobyte = getFileSizeInKilobyte(path);
if (sizeKilobyte > maxLogoSizeInKilobyte) {
console.log(`Resizing image at path ${path} from ${sizeKilobyte} kB`);
await compressTinyPNG(path)
.then(() => {
updated = true;
console.log(`Resized image at path ${path} from ${sizeKilobyte} kB => ${getFileSizeInKilobyte(path)} kB`);
})
.catch(e => {
console.log(chalk.red(e.message));
});
}
return updated;
}