59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
export async function convertImageToBlob({
|
|
url,
|
|
width,
|
|
height,
|
|
type,
|
|
}: {
|
|
url: string
|
|
width?: number // Ширина необязательна
|
|
height?: number // Высота необязательна
|
|
type: string
|
|
}): Promise<Blob> {
|
|
if (!width && !height) {
|
|
throw new Error('Необходимо указать хотя бы одно значение: width или height.')
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const img = new Image()
|
|
|
|
img.onload = () => {
|
|
// Вычисляем размеры, сохраняя пропорции
|
|
const aspectRatio = img.naturalWidth / img.naturalHeight
|
|
const targetWidth = width || height! * aspectRatio
|
|
const targetHeight = height || width! / aspectRatio
|
|
|
|
// Создаем canvas и рисуем изображение
|
|
const canvas = document.createElement('canvas')
|
|
canvas.width = Math.round(targetWidth)
|
|
canvas.height = Math.round(targetHeight)
|
|
const context = canvas.getContext('2d')
|
|
|
|
if (!context) {
|
|
return reject(new Error('Ошибка создания контекста'))
|
|
}
|
|
context.drawImage(img, 0, 0, canvas.width, canvas.height)
|
|
|
|
// Конвертируем canvas в Blob
|
|
canvas.toBlob(
|
|
(blob) => {
|
|
if (blob) {
|
|
resolve(blob)
|
|
} else {
|
|
reject(new Error('Ошибка создания изображения'))
|
|
}
|
|
},
|
|
type,
|
|
1.0,
|
|
)
|
|
|
|
URL.revokeObjectURL(url)
|
|
}
|
|
|
|
img.onerror = () => {
|
|
reject(new Error('Ошибка загрузки изображения'))
|
|
}
|
|
|
|
img.src = url
|
|
})
|
|
}
|