Files
omni-tools/src/pages/tools/image/generic/rotate/service.ts
Ibrahima G. Coulibaly 9a9ce814fd ```
feat: fix Blob type in tools (main)

This commit fixes a type-related issue. The 'Blob'
constructor was used without specifying 'as any' for the
data argument in several tools. This change ensures
correctness and prevents potential type errors.

The following files were modified:
- src/pages/tools/video/change-speed/index.tsx
- src/pages/tools/video/crop-video/service.ts
- src/pages/tools/audio/trim/service.ts
- src/pages/tools/video/merge-video/service.ts
- src/pages/tools/video/rotate/service.ts
- src/pages/tools/image/generic/rotate/service.ts
- src/pages/tools/pdf/merge-pdf/service.ts
- src/pages/tools/pdf/rotate-pdf/service.ts
- src/pages/tools/video/compress/service.ts
- src/pages/tools/video/flip/service.ts
- src/pages/tools/video/trim/index.tsx
- src/pages/tools/video/loop/service.ts
- src/pages/tools/audio/extract-audio/service.ts
- src/pages/tools/pdf/split-pdf/service.ts
- src/pages/tools/audio/change-speed/service.ts
- src/pages/tools/image/generic/resize/service.ts
- src/pages/tools/video/gif/change-speed/index.tsx
- src/pages/tools/audio/merge-audio/service.ts
- src/pages/tools/video/video-to-gif/index.tsx
2025-10-02 22:33:34 +01:00

75 lines
2.2 KiB
TypeScript

import { InitialValuesType } from './type';
import { FFmpeg } from '@ffmpeg/ffmpeg';
import { fetchFile } from '@ffmpeg/util';
export const processImage = async (
file: File,
options: InitialValuesType
): Promise<File | null> => {
const { rotateAngle, rotateMethod } = options;
if (file.type === 'image/svg+xml') {
try {
// Read the SVG file
const fileText = await file.text();
const parser = new DOMParser();
const svgDoc = parser.parseFromString(fileText, 'image/svg+xml');
const svgElement = svgDoc.documentElement as unknown as SVGSVGElement;
// Get current transform attribute or create new one
let currentTransform = svgElement.getAttribute('transform') || '';
const angle = parseInt(rotateAngle);
// Add rotation if needed
if (angle !== 0) {
// Get SVG dimensions
const bbox = svgElement.getBBox();
const centerX = bbox.x + bbox.width / 2;
const centerY = bbox.y + bbox.height / 2;
currentTransform += ` rotate(${angle} ${centerX} ${centerY})`;
}
// Apply transform
svgElement.setAttribute('transform', currentTransform.trim());
// Convert back to file
const serializer = new XMLSerializer();
const svgString = serializer.serializeToString(svgDoc);
const blob = new Blob([svgString], { type: 'image/svg+xml' });
return new File([blob], file.name, { type: 'image/svg+xml' });
} catch (error) {
console.error('Error processing SVG:', error);
return null;
}
}
// For non-SVG images, use FFmpeg
try {
const ffmpeg = new FFmpeg();
await ffmpeg.load();
// Write input file
await ffmpeg.writeFile('input', await fetchFile(file));
// Determine rotation command
const rotateCmd = `rotate=${rotateAngle}*PI/180`;
// Execute FFmpeg command
await ffmpeg.exec([
'-i',
'input',
'-vf',
rotateCmd,
'output.' + file.name.split('.').pop()
]);
// Read the output file
const data = await ffmpeg.readFile('output.' + file.name.split('.').pop());
return new File([data as any], file.name, { type: file.type });
} catch (error) {
console.error('Error processing image:', error);
return null;
}
};