Explain Codes LogoExplain Codes Logo

How to display an image stored as byte array in HTML/JavaScript?

javascript
base64-encoding
image-handling
performance-optimization
Nikita BarsukovbyNikita Barsukov·Feb 17, 2025
TLDR

To display an image stored as a byte-array in HTML, convert it to a Base64 encoded string using btoa() & Uint8Array and assign it as the src of an img element. Also, prepend "data:image/jpeg;base64," for the data URI.

let base64String = btoa(String.fromCharCode(...new Uint8Array(byteArray))); document.getElementById('yourImg').src = `data:image/jpeg;base64,${base64String}`;
<img id="yourImg" alt="Byte Array Image"/>

If your image is not a JPEG, make sure to replace jpeg in "data:image/jpeg;base64," with the actual format of your image.

Understanding the byte array to Base64 process

Byte arrays are often used for handling image data in web development. Here's a detailed look at how you convert a byte array to a Base64 string to display an image, and some additional related considerations to keep in mind.

Step by step conversion: from raw bytes to beautiful picture

When you have an image in a byte array form (like when you fetch it from an API or process a user-uploaded file), you need to convert this binary data into a format interpretable by the browser. For this, we convert the byte array into a base64 encoded string, which is a format supported in every modern browser.

One thing to remember while using this method is that Base64 encoding increases data size by approximately 33%. If you're dealing with large images or a use case where performance is critical, you may need to explore other techniques or optimizations.

ECMAScript magic: Transforming blobs and byte arrays

Base64 is widely used for byte array conversion, but it’s not the only trick up JavaScript's sleeve. Depending on the specific requirements of your application, there are other strategies:

  • Blob URLs: Create a blob from the byte array, generate a URL using URL.createObjectURL(). Blob URLs might be tiny, but remember to revoke them when not in use to avoid memory leaks.

  • Canvas Element: This method involves painting the image directly onto a canvas and then converting it into a data URL or blob.

  • WebAssembly: If you experience performance constraints while handling large datasets or require heavy processing, WebAssembly could offer near-native performance.

Gotchas and Caveats

With great power comes great responsibility and opening this Pandora’s box of byte arrays and images might lead to encountering some common issues:

  • MIME type mismatches: Check that the MIME type in the data URL matches the actual image format.
  • Character encoding: When converting binary data, beware! UTF-16 could stir trouble if not handled correctly.
  • Large datasets: If image sizes are huge, Houston, we might have a performance problem. Consider loading them lazily or using thumbnails.
  • CORS dragons: If the byte array is fetched from a remote source, remember CORS policies apply.

Taking it up a notch: Optimizing image handling

While you've mastered displaying byte array images, there are ways to enhance efficiency, especially if resource constraints feel like a straightjacket.

Typed Array usage: Save memory like a boss

Use Uint8Array or similar typed arrays to handle binary data more efficiently in JavaScript.

Memory Management: Cleaning up after the party

When dealing with large images, keep an eye on memory usage. Remember to release object URLs and clear any canvases post usage.

Performance Profiling: Operate at the speed of light

Utilize your browser’s developer tools for profiling and optimizing image rendering performance.

Best Practices: Like mama always said

Minimize DOM manipulations, avoid synchronous XMLHTTPRequest, and other best practices for a smooth user experience.