Files
hereconnect/src/utils/images/convertImageToBlob.ts
T
ti 66093e9c80
Main daploy / deploy (push) Successful in 44s
add label to qr-code
2024-11-19 20:30:57 +02:00

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
})
}