javascript - How can I use createImageBitmap with raw data as input rather then an image - Stack Overflow

I am writing a data viz app that requires me to process very large 2D arrays of data and convert that d

I am writing a data viz app that requires me to process very large 2D arrays of data and convert that data into a scaled down image for display in a canvas in the DOM.

I am bumping up against DOM canvas size limitations. My arrays can be as large as 5000 x 5000. I want to get around the canvas size limitation by using createImageBitmap() to simultaneously scale down and convert the large array to an ImageBitMap of smaller size - 256 x 256 - for insertion into an onscreen canvas.

How can I convert the raw array data into the proper format? Will this approach work?

I am writing a data viz app that requires me to process very large 2D arrays of data and convert that data into a scaled down image for display in a canvas in the DOM.

I am bumping up against DOM canvas size limitations. My arrays can be as large as 5000 x 5000. I want to get around the canvas size limitation by using createImageBitmap() to simultaneously scale down and convert the large array to an ImageBitMap of smaller size - 256 x 256 - for insertion into an onscreen canvas.

How can I convert the raw array data into the proper format? Will this approach work?

Share Improve this question asked Sep 13, 2019 at 14:31 dugladugla 12.9k26 gold badges94 silver badges139 bronze badges 4
  • what is the raw data that you have in your 2D array, can you elaborate on that? – 123survesh Commented Sep 13, 2019 at 14:44
  • It is a bit hard to isolate. My current approach is: 1) Draw array into OffScreenCanvas of identical size. 2) call drawImage() on the smaller destination canvas - 256 x 256 which performs both to minify and to copy. For an array large then about 4K x 4K the destination canvas is never written. No error. Below that size it works fine. – dugla Commented Sep 13, 2019 at 15:14
  • You could potentially reduce the data algorithmicly, it's a bit of a step away from what you currently have, but e.g. averaging each 2x2 block of pixels down to a single pixel worth of colour would quarter the number of pixels. – DBS Commented Sep 13, 2019 at 15:25
  • Yes I agree. The "proper" approach would be to downsample the array data and just hand it to the destination canvas. I am hoping to get "free" downsampling using imaging functionality rather then rolling my own, – dugla Commented Sep 13, 2019 at 15:26
Add a ment  | 

1 Answer 1

Reset to default 7

You can create and manipulate your image before rendering it to canvas. 5000x5000 shouldn't be too large for canvas though. What limitations are you running into? Answer here covers resizing as on canvas then grabbing data.

var raw = new Uint8ClampedArray(5000*5000*4); // 4 for RBGA
var imageData = new ImageData(raw, 5000,5000);
var bitmap = createImageBitmap(imageData);

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744817363a4595407.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信