mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-12-29 16:16:02 +00:00
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
75 lines
2.2 KiB
TypeScript
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;
|
|
}
|
|
};
|