Alors que certains de ces extraits de code sont courts et fonctionnent, ils ne sont pas triviaux à suivre et à comprendre.
Comme je ne suis pas fan du "copier-coller" depuis stack-overflow, j'aimerais que les développeurs comprennent le code qu'ils intègrent dans leur logiciel, j'espère que ce qui suit vous sera utile.
DEMO: Redimensionnement des images avec JS et HTML Canvas Demo fiddler.
Vous pouvez trouver 3 méthodes différentes pour redimensionner, ce qui vous aidera à comprendre comment le code fonctionne et pourquoi.
https://jsfiddle.net/1b68eLdr/93089/
Le code complet des deux démos, ainsi que la méthode TypeScript que vous pouvez vouloir utiliser dans votre code, peut être trouvé dans le projet GitHub.
https://github.com/eyalc4/ts-image-resizer
Voici le code final :
export class ImageTools {
base64ResizedImage: string = null;
constructor() {
}
ResizeImage(base64image: string, width: number = 1080, height: number = 1080) {
let img = new Image();
img.src = base64image;
img.onload = () => {
// Vérifiez si l'image nécessite un redimensionnement
if(img.height <= height && img.width <= width) {
this.base64ResizedImage = base64image;
// TODO: Appeler la méthode pour faire quelque chose avec l'image redimensionnée
}
else {
// Assurez-vous que la largeur et la hauteur conservent le rapport hauteur/largeur d'origine et ajustez si nécessaire
if(img.height > img.width) {
width = Math.floor(height * (img.width / img.height));
}
else {
height = Math.floor(width * (img.height / img.width));
}
let resizingCanvas: HTMLCanvasElement = document.createElement('canvas');
let resizingCanvasContext = resizingCanvas.getContext("2d");
// Commencez avec la taille d'image d'origine
resizingCanvas.width = img.width;
resizingCanvas.height = img.height;
// Dessinez l'image d'origine sur le canvas de redimensionnement (temporaire)
resizingCanvasContext.drawImage(img, 0, 0, resizingCanvas.width, resizingCanvas.height);
let curImageDimensions = {
width: Math.floor(img.width),
height: Math.floor(img.height)
};
let halfImageDimensions = {
width: null,
height: null
};
// Réduisez rapidement la taille de moitié à chaque fois en quelques itérations jusqu'à ce que la taille soit inférieure à 2 fois la taille cible - la motivation pour cela est de réduire le crénelage qui aurait été créé avec la réduction directe d'une très grande image à une petite image
while (curImageDimensions.width * 0.5 > width) {
// Réduisez le canvas de redimensionnement de moitié et rafraîchissez l'image
halfImageDimensions.width = Math.floor(curImageDimensions.width * 0.5);
halfImageDimensions.height = Math.floor(curImageDimensions.height * 0.5);
resizingCanvasContext.drawImage(resizingCanvas, 0, 0, curImageDimensions.width, curImageDimensions.height,
0, 0, halfImageDimensions.width, halfImageDimensions.height);
curImageDimensions.width = halfImageDimensions.width;
curImageDimensions.height = halfImageDimensions.height;
}
// Faites maintenant le redimensionnement final pour que le canvas de redimensionnement réponde aux exigences de dimension
// directement sur le canvas de sortie, qui produira l'image finale
let outputCanvas: HTMLCanvasElement = document.createElement('canvas');
let outputCanvasContext = outputCanvas.getContext("2d");
outputCanvas.width = width;
outputCanvas.height = height;
outputCanvasContext.drawImage(resizingCanvas, 0, 0, curImageDimensions.width, curImageDimensions.height,
0, 0, width, height);
// exportez les pixels du canvas en tant qu'image. params: format, qualité
this.base64ResizedImage = outputCanvas.toDataURL('image/jpeg', 0.85);
// TODO: Appeler la méthode pour faire quelque chose avec l'image redimensionnée
}
};
}}