【发布时间】:2020-02-01 05:36:27
【问题描述】:
我已阅读教程:http://fabricjs.com/articles 和有关 Fabric Objects 的文档。
我能够加载 JPG 和 PNG 图像,但在我的项目中,我需要将 TIFF 图像加载到画布上并能够在其上应用过滤器。我可以使用画布上下文渲染 TIFF 图像,但是每当调用“renderAll()”时,它都会清除上下文并清除我的 TIFF 图像。由于无法渲染,我也无法执行缩放、平移、亮度和对比度等其他操作。
谁能帮我了解如何将 TIFF 图像转换为 Fabric 对象,以便我可以对其执行所有标准的 fabric.Object 相关操作。
这是我遵循的步骤:
-
要加载模拟 TIFF 图像,我将其作为数组缓冲区读取。
public loadMockTiffImage() { // Create a new XMLHttpRequest object to read the mock TIFF image as ArrayBuffer const xhr = new XMLHttpRequest(); // Configure it: GET-request for the URL xhr.open('GET', 'assets/tif/sample.tif', true); xhr.responseType = 'arraybuffer'; xhr.timeout = 10000; // timeout in ms, 10 seconds // Send the request over the network xhr.send(); // After the response is received, load it xhr.onload = () => { // analyze HTTP status of the response if (xhr.status !== 200) { // throw error incase status is not 200 console.log(`Error ${xhr.status}: ${xhr.statusText}`); } else { // Show the result console.log(`Done, got ${xhr.response.byteLength} bytes`); console.log(xhr.response); // Add to canvas the XHR response which is of type ArrayBuffer this.addTiffImageOnCanvas(xhr.response); } }; // Show progress of loading the bytes xhr.onprogress = event => { if (event.lengthComputable) { console.log(`Received ${event.loaded} of ${event.total} bytes`); } else { console.log(`Received ${event.loaded} bytes`); // no Content-Length } }; // Log any network request errors xhr.onerror = () => { console.log('Request failed!'); }; } -
接下来我使用 UTIF.js 解码 ArrayBuffer 并将其转换为 ImageBitmap,以便我可以使用 canvas.drawImage() 在画布上呈现它。 如何将此 ImageBitmap/ArrayBuffer 转换为 FabricJS 对象?
private addTiffImageOnCanvas(buffer: ArrayBuffer) { // Using UTIF.js to decode the array buffer and convert it to ImageBitmap const ifds = UTIF.decode(buffer); UTIF.decodeImage(buffer, ifds[0]); const timage = ifds[0]; const array = new Uint8ClampedArray(UTIF.toRGBA8(timage)); // Forming image Data const imageData = new ImageData(array, timage.width, timage.height); let ibm: ImageBitmap = null; const bmPromise: Promise<ImageBitmap> = createImageBitmap(imageData); bmPromise.then(bitmap => { ibm = bitmap; fabric.Image.fromObject(ibm, image => { // TODO: How or What should I do now? }); });}
感谢您的帮助。
【问题讨论】:
标签: javascript typescript fabricjs tiff