Step 1: Rename the .PIX file so it has the extension .data. This is needed for GIMP to recognize it as a “raw” data file.
Step 2: Open this image in GIMP by expanding “Select File Type” and choosing Raw image data. That should allow the .data file to show up in the browser to open it.

Step 3: The file will open and you must adjust settings to tell GIMP more about the image. Under Pixel format, select Grayscale 4-bit. For the Width and Height, set them to 256 (if it is a 32K file) or 128 (if it is 8K). Now you should be able to Open the image.

Step 4: With the image open, you will need to Invert it to get the colors correct (Colors -> Invert) and rotate the image clockwise (Image -> Transform -> Rotate 90 clockwise).
Step 5: That should give you a 256×256 or 128×128 16-greyscale image you can now save out in whatever format you wish. GIMP can save based on the extension you give it when exporting. (File -> Export As… then change the extension to .PNG or .GIF or whatever.)
Tada!

Neat.
Or, I had A.I. write this quick conversion script… It can convert one file at a time, or run it in a directory with .PIX files and it will do them all. It currently only supports the 128×128 16-grey and 256×256 16-grey photos. I recall there was a 64-grey mode, so if I find one of those images, I will update the script to do them, too.
#!/usr/bin/env python3
import sys
import glob
from PIL import Image
def convert_pix(pix_file):
with open(pix_file, 'rb') as f:
data = f.read()
if len(data) == 32768:
width, height = 256, 256
elif len(data) == 8192:
width, height = 128, 128
else:
print(f"Invalid file size for {pix_file} (expected 8192 or 32768 bytes)")
return
pixels = []
for byte in data:
pixels.append(byte >> 4)
pixels.append(byte & 0x0F)
# Create image
img = Image.new('P', (width, height))
img.putdata(pixels)
# Rotate right 90 degrees (CW)
img = img.rotate(-90)
# Invert colors
inverted_pixels = [15 - p for p in img.getdata()]
img.putdata(inverted_pixels)
# Set greyscale palette
palette = []
for i in range(16):
v = i * 255 // 15
palette.extend([v, v, v])
img.putpalette(palette)
# Save as PNG
output_file = pix_file.replace('.PIX', '.png').replace('.pix', '.png')
img.save(output_file)
print(f"Converted {pix_file} ({width}x{height}) to {output_file}")
def main():
if len(sys.argv) == 1:
pix_files = glob.glob('*.PIX') + glob.glob('*.pix')
if not pix_files:
print("No .PIX files found in current directory")
sys.exit(1)
else:
pix_files = sys.argv[1:]
for pix_file in pix_files:
convert_pix(pix_file)
if __name__ == "__main__":
main()
You can find it on my GitHub along with documentation on what all it needs to run:
https://github.com/allenhuffman/DS69-PIX-to-PNG
Good luck!
