@@ -0,0 +1,58 @@
|
||||
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
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user