Convert Image to binary stream

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

There are two sides to my app, on one side I'm using C++ in order to read the frames from a camera using Pleora's EBUS SDK. When this stream is first received, before I convert the buffer to an image, I am able to read the stream 16 bits at a time in order to perform some calculations for each pixel, i.e. there exists a 16 bit chunk of data for each pixel.

Now the second half is a Django web app where I am also presented this video output, this time via an ffmpeg, nginx, hls stream. When the user clicks on the video I want to be able to take the current frame and the coordinates of their click and perform the same calculation as I do above in the C++ portion.

Right now I use an html5 canvas to capture the frame and I use canvas.toDataURL() in order to convert the frame into a base64 encoded image, I then pass the base64 image, the coordinates, and the dimensions of the frame to python via AJAX.

In python I am trying to manipulate this base64 encoded image in such a way as to get 16 bits per pixel. At the moment I do the following:

pos = json.loads(request.GET['pos']) str_frame = json.loads(request.GET['frame']) dimensions = json.loads(request.GET['dimensions'])  pixel_index = (dimensions['width'] * pos['y']) + pos['x'] + 1  b64decoded_frame = base64.b64decode(str_frame.encode('utf-8')) 

However, there are far fewer indexes in the b64decoded_frame then there are pixels in the image and the integer values aren't nearly as high as expected. I have checked and the image is intact as I am able to save it as a png.

To summarize, how do I convert a base64 image into a serialized binary stream where each pixel is represented by 16 bits.

UPDATE

I forgot to mention that I'm using python3.2

And after some more research I think that what I'm trying to do it get the mono16 value of a given pixel. I don't know for sure if that is what I want to do but if anyone could explain how to either convert an image to mono16 or a pixel to mono16 I could explore that and see if it is in fact the solution.

回答1:

The solution that I've chosen is to convert the image into an 8-bit greyscale image then convert the desired pixel into its 16-bit counterpart. The solution looks like the following:

import base64 import io from PIL import Image  if request.method == 'GET':     if request.GET['pos'] and request.GET['frame']:         pos = json.loads(request.GET['pos'])         str_frame = json.loads(request.GET['frame'])          # Converts the base64 string into a byte string, we need to encode         # str_frame as utf-8 first otherwise python3.2 complains about unicode         b64decoded_frame = base64.b64decode(str_frame.encode('utf-8'))          # This puts the decoded image into a buffer so that I don't need to save         # it to disk to use it in PIL         byte_stream = io.BytesIO(b64decoded_frame)          # Open the image and convert it to 8-bit greyscale (mono8)         img = Image.open(byte_stream).convert('L')          # Get the 8-bit pixel value         pixel_val = img.getpixel((pos['x'], pos['y']))          # Convert the 8-bit pixel value to 16-bit by holding the rations         # i.e. n8 / (2^8 - 1) == x16 / (2^16 - 1)         pixel_val = int(pixel_val / 255 * 65535) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!