Deutsch   English   Français   Italiano  
<vkqeam$2odai$1@paganini.bofh.team>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!feeds.phibee-telecom.net!2.eu.feeder.erje.net!feeder.erje.net!newsfeed.bofh.team!paganini.bofh.team!not-for-mail
From: Stefan Claas <pollux@tilde.club>
Newsgroups: sci.crypt
Subject: [file2png] Convert (encrypted) binary data to .png images and back
Date: Sun, 29 Dec 2024 04:05:58 +0100
Organization: To protect and to server
Message-ID: <vkqeam$2odai$1@paganini.bofh.team>
Mime-Version: 1.0
Injection-Date: Sun, 29 Dec 2024 03:05:58 -0000 (UTC)
Injection-Info: paganini.bofh.team; logging-data="2897234"; posting-host="fWMvsfsAKClk+dLC0zX7xw.user.paganini.bofh.team"; mail-complaints-to="usenet@bofh.team"; posting-account="9dIQLXBM7WM9KzA+yjdR4A";
User-Agent: flnews/1.3.0pre29 (for GNU/Linux)
Cancel-Lock: sha1:F2UVCf7KdHH5U42edmTSbqdoHBg=
X-Ed25519-Sig: adbb35f5904ebe5cabeabcc6b977813c3ace3bff427b75fee785e88515ebafca
 d53ce6cca43705350086d42f8c3637c17f892d9a424a884628b13af9f718970c
X-Ed25519-Pub: c0ffee5a36e581eb10f60b2831b3cdb955d2e7ef680dd282a8d43ad8b84b357a
X-Notice: Filtered by postfilter v. 0.9.3
X-Date: It's Sun Sep 11443 04:05:58 AM CET 1993, the September that never ends.
Bytes: 4743
Lines: 118

Hi all,

here is a Python3 implementation of my file2png program,
available here: https://github.com/706f6c6c7578/file2png

Hope you find it useful, when for example uploading such
images to platforms like X, which does not compress .png
images, as I have tested!

import argparse
import math
import os
import struct
from PIL import Image
import sys

def encode_file(input_stream, output_stream):
    data = input_stream.read()
    file_size = len(data)
    pixel_count = (file_size + 8) // 3
    dimension = math.ceil(math.sqrt(pixel_count))

    img = Image.new('RGBA', (dimension, dimension), (0, 0, 0, 255))
    pixels = img.load()

    size_buf = struct.pack('<Q', file_size)
    x, y = 0, 0

    for i in range(0, 8, 3):
        r = size_buf[i]
        g = size_buf[i+1] if i+1 < 8 else 0
        b = size_buf[i+2] if i+2 < 8 else 0
        pixels[x, y] = (r, g, b, 255)
        x += 1
        if x >= dimension:
            x = 0
            y += 1

    for i in range(0, len(data), 3):
        r = data[i]
        g = data[i+1] if i+1 < len(data) else 0
        b = data[i+2] if i+2 < len(data) else 0
        pixels[x, y] = (r, g, b, 255)
        x += 1
        if x >= dimension:
            x = 0
            y += 1

    img.save(output_stream, format='PNG')

def decode_file(input_stream, output_stream):
    img = Image.open(input_stream)
    pixels = img.load()
    width, height = img.size

    size_buf = bytearray(8)
    pixel_index = 0
    for i in range(0, 8, 3):
        x = pixel_index % width
        y = pixel_index // width
        r, g, b, _ = pixels[x, y]
        size_buf[i] = r
        if i+1 < 8:
            size_buf[i+1] = g
        if i+2 < 8:
            size_buf[i+2] = b
        pixel_index += 1

    file_size = struct.unpack('<Q', size_buf)[0]
    data = bytearray(file_size)

    data_index = 0
    start_pixel = (8 + 2) // 3
    for y in range(start_pixel // width, height):
        start_x = 0 if y != start_pixel // width else start_pixel % width
        for x in range(start_x, width):
            if data_index >= file_size:
                break
            r, g, b, _ = pixels[x, y]
            data[data_index] = r
            if data_index + 1 < file_size:
                data[data_index+1] = g
            if data_index + 2 < file_size:
                data[data_index+2] = b
            data_index += 3

    output_stream.write(data[:file_size])

def main():
    parser = argparse.ArgumentParser(description="file2png - Convert any file to PNG and back")
    parser.add_argument("-d", action="store_true", help="decode PNG to file")
    parser.add_argument("input", nargs="?", default="-", help="Input file (default: stdin)")
    parser.add_argument("output", nargs="?", default="-", help="Output file (default: stdout)")

    args = parser.parse_args()

    input_stream = sys.stdin.buffer if args.input == "-" else open(args.input, "rb")
    output_stream = sys.stdout.buffer if args.output == "-" else open(args.output, "wb")

    try:
        if args.d:
            decode_file(input_stream, output_stream)
        else:
            encode_file(input_stream, output_stream)
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)
    finally:
        if input_stream is not sys.stdin.buffer:
            input_stream.close()
        if output_stream is not sys.stdout.buffer:
            output_stream.close()

if __name__ == "__main__":
    main()

-- 
Regards
Stefan