I would like to play a video (with python) on my HP Prime G2. I know this sounds stupid but please. So, I already converted the video to a list of pixels but I realise that drawing the pixels one by one on the screen is VERY VERY slow. So I'm wondering if there is any faster way of drawing a whole image (best solution but less probable) or a method, function or something like that to speedup the drawing process. I can draw a single pixel or a rectangle. Here are my encode/decode python scripts if anyone is interested: encode.py import cv2 import numpy as np COLOR_THRESHOLD = 60 PIXEL_SIZE = 2 WIDTH, HEIGHT = 320 // PIXEL_SIZE, 240 // PIXEL_SIZE video = cv2.VideoCapture(r'./video.mp4') def is_close_to_black(pixel, threshold=20): # Check if any of the RGB values are below the threshold return all(component < threshold for component in pixel) def ColorDistance(rgb1, rgb2): return np.linalg.norm(np.array(rgb1) - np.array(rgb2)) def rgb_to_hex(rgb): hex_color = f'{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}' return hex_color.upper() with open('video.txt', 'w') as file: # Use 'w' for writing text data currentframe = 0 lastframe = np.zeros((HEIGHT, WIDTH, 3), dtype=int) while True: ret, frame = video.read() if not ret: break # Resize frame to match the defined WIDTH and HEIGHT frame = cv2.resize(frame, (WIDTH, HEIGHT)) lines = [] for i, row in enumerate(frame): filtered_pixels = [pixel for pixel in row if not is_close_to_black(pixel)] if not filtered_pixels: lines.append('0') else: row_result = [] for ii, pixel in enumerate(row): if ColorDistance(lastframe[ii], pixel) < COLOR_THRESHOLD: row_result.append('?') else: row_result.append(rgb_to_hex(pixel)) # Format the line for the current row line = ','.join(row_result) lines.append(line) # Write the lines to the file file.write(';'.join(lines) + '\n') # Update the lastframe with the current frame lastframe = frame.copy() currentframe += 1 print('Done with frame ' + str(currentframe)) video.release() decode.py # PYTHON EXPORT giffer() from graphic import draw_rectangle PIXEL_SIZE = 2 WIDTH, HEIGHT = 320 // PIXEL_SIZE, 240 // PIXEL_SIZE def hex_to_rgb(hex_color): rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) return rgb def process_line(line, y): if line.strip() == '0': draw_rectangle(0, 0, WIDTH * PIXEL_SIZE, PIXEL_SIZE, [0, 0, 0]) return colors = line.strip().split(',') x = 0 while x < len(colors): if colors[x] == '?': x += 1 continue current_color = hex_to_rgb(colors[x]) start_x = x # Find the length of the current run of the same color or '?' while x < len(colors) and (colors[x] == '?' or colors[x] == colors[start_x]): x += 1 end_x = x # Draw the combined rectangle draw_rectangle(start_x * PIXEL_SIZE, y * PIXEL_SIZE, (end_x - start_x) * PIXEL_SIZE, PIXEL_SIZE, [current_color[2], current_color[1], current_color[0]]) def process_frame(frame): y = 0 for line in frame.split(';'): process_line(line, y) if y == HEIGHT: y = 0 else: y += 1 FILENAME = 'video' # input('File ID: ') # Open the video file for reading in text mode ('r') draw_rectangle(0, 0, WIDTH * PIXEL_SIZE, HEIGHT * PIXEL_SIZE, [0, 0, 0]) with open('../videos.hpappdir/' + FILENAME + '.txt', 'r', encoding='utf-8') as f: for line in f: process_frame(line) # end Continue reading...