Hier ist mein Code:Wie bekomme ich Bildbreite und -höhe in einem Web-Arbeiter?
// process-image.js (web-worker)
self.addEventListener('message', ev => {
const {id,file} = ev.data;
const reader = new FileReader();
reader.onload = ev => {
const imageFile = new Image(); // <-- error is here
imageFile.src = ev.target.result;
imageFile.onload =() => {
const fit = makeFit(imageFile);
self.postMessage({
id,
file: {
src: ev.target.result,
width: fit.width,
height: fit.height,
}
})
}
};
reader.readAsDataURL(file);
});
Dies wurde in dem Haupt-UI-Thread funktioniert gut, aber anscheinend habe ich keinen Zugriff auf Image
innerhalb eines Web-Arbeiters. Der spezifische Fehler ist:
Uncaught ReferenceError: Image is not defined at FileReader.reader.onload (process-image.js:12)
Gibt es eine andere Möglichkeit, die Breite und Höhe eines Bildes zu erhalten?
Ich möchte so viele Dateitypen wie möglich unterstützen, aber nur JPG ist gut genug für jetzt, wenn es eine Art von Bibliothek gibt, die dies tun kann und in einem Web-Arbeiter ausgeführt wird.
Hier ist das entsprechende Bit aus dem UI-Thread:
// some-react-component.js
componentDidMount() {
this.worker = new ImageWorker();
this.worker.addEventListener('message', ev => {
const {id, file} = ev.data;
this.setState(({files}) => {
files = files.update(id, img => ({
...img,
...file,
}))
const withWidths = files.filter(f => f.width);
const avgImgWidth = withWidths.reduce((acc, img) => acc + img.width, 0)/withWidths.size;
return {files, avgImgWidth};
});
});
}
onDrop = ev => {
ev.preventDefault();
Array.prototype.forEach.call(ev.dataTransfer.files, file => {
const id = shortid();
this.worker.postMessage({id, file});
const img = {
id,
width: null,
height: null,
src: null,
name: file.name,
}
this.setState(({files}) => ({files: files.set(id, img)}));
});
}
Das Einzige, was wert hier erwähnen ist, dass id
nur eine zufällige UUID ist, und file
ist ein File
. Ich gebe das Ganze an den Web-Arbeiter weiter, damit ich dort die gesamte Verarbeitung machen kann.
Awww ja! 'createImageBitmap' sieht genau so aus, wie ich gesucht habe. Könnte sogar bei der Größenanpassung helfen, was meine nächste Aufgabe war. Werde das bald versuchen, danke! – mpen
YE Entschuldigung, kopiert eingefügt wirklich schnell, um die Antwort zu posten, wird bearbeiten, danke! – PiniH