MarlinFirmware/E3S1PROFROKBYTT_orcaslicer_thumbnail.py

96 lines
3.5 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
#
# Orca Slicer remove headers before jpg.
#
# This script has been developed for E3S1PROFORKBYTT by Thomas Toka.
#
# ------------------------------------------------------------------------------
import sys
import base64
from PIL import Image
from io import BytesIO
# Get the g-code source file name
sourceFile = sys.argv[1]
# Read the ENTIRE g-code file into memory
with open(sourceFile, "r") as f:
lines = f.readlines()
# Find the index of the line containing '; HEADER_BLOCK_START'
header_start = None
for i, line in enumerate(lines):
if line.strip() == '; HEADER_BLOCK_START':
header_start = i
break
# Find the index of the line containing '; THUMBNAIL_BLOCK_START'
thumbnail_start = None
for i, line in enumerate(lines):
if line.strip() == '; THUMBNAIL_BLOCK_START':
thumbnail_start = i
break
# Ensure both start markers were found for header and thumbnail
if header_start is not None and thumbnail_start is not None:
# Remove the lines between '; HEADER_BLOCK_START' and '; THUMBNAIL_BLOCK_START' including the marker lines
del lines[header_start:thumbnail_start+1]
# Find the index of the line containing '; thumbnail begin' or a similar line
index_begin = None
for i, line in enumerate(lines):
if '; thumbnail begin' in line:
index_begin = i
break
# Find the index of the line containing '; thumbnail end'
index_end = None
for i, line in enumerate(lines[index_begin:], start=index_begin):
if line.strip() == '; thumbnail end':
index_end = i
break
# Ensure both start and end markers were found for thumbnail
if index_begin is not None and index_end is not None:
# Extract the original PNG data from the lines between '; thumbnail begin' and '; thumbnail end'
original_png_data = "".join(lines[index_begin + 1:index_end])
# Remove "; " from the extracted PNG data
original_png_data = original_png_data.replace("; ", "")
try:
# Decode the original PNG data
png_data_bytes = base64.b64decode(original_png_data)
image = Image.open(BytesIO(png_data_bytes))
image = image.convert("RGB") # Convert to RGB mode
# Encode the image as JPEG
buffer = BytesIO()
image.save(buffer, format="JPEG")
image_jpg_data = buffer.getvalue()
# Base64 encode the JPEG data
image_jpg_base64 = base64.b64encode(image_jpg_data).decode('utf-8')
# Calculate the size of the JPEG data in bytes
jpg_data_size = len(image_jpg_base64)
# Replace the size in the '; thumbnail begin' line
lines[index_begin] = f'; thumbnail begin 250x250 {jpg_data_size}\n'
# Calculate the maximum line length
max_line_length = 79 - len("; ")
# Prepare the injected JPEG data with each line on a new line
injected_jpg_data = ["; " + image_jpg_base64[i:i + max_line_length] for i in range(0, len(image_jpg_base64), max_line_length)]
# Insert the new formatted JPEG data into the original lines
lines[index_begin + 1:index_end] = [line + "\n" for line in injected_jpg_data]
# Write the modified content back to the original file
with open(sourceFile, "w") as f:
f.writelines(lines)
except Exception as e:
sys.exit(1)