Надеюсь, из моего другого ответа, здесь , теперь вы лучше понимаете, как отформатированы ваши файлы. Итак, код должен выглядеть примерно так:
#!/usr/bin/env python3
import sys
import re
import numpy as np
from PIL import Image
import cv2
rawData = open('EW0220137564B.IMG', 'rb').read()
# File size in bytes
fs = len(rawData)
bitDepth = int(re.search("SAMPLE_BITS\s+=\s+(\d+)",str(rawData)).group(1))
bytespp = int(bitDepth/8)
height = int(re.search("LINES\s+=\s+(\d+)",str(rawData)).group(1))
width = int(re.search("LINE_SAMPLES\s+=\s+(\d+)",str(rawData)).group(1))
print(bitDepth,height,width)
# Offset from start of file to image data - assumes image at tail end of file
offset = fs - (width*height*bytespp)
# Check bitDepth
if bitDepth == 8:
na = np.frombuffer(rawData, offset=offset, dtype=np.uint8).reshape(height,width)
elif bitDepth == 16:
dt = np.dtype(np.uint16)
dt = dt.newbyteorder('>')
na = np.frombuffer(rawData, offset=offset, dtype=dt).reshape(height,width).astype(np.uint8)
else:
print(f'ERROR: Unexpected bit depth: {bitDepth}',file=sys.stderr)
# Save either with PIL
Image.fromarray(na).save('result.jpg')
# Or with OpenCV may be faster
cv2.imwrite('result.jpg', na)
Если у вас есть тысячи дел, я бы порекомендовал GNU Parallel , который вы можете легко установить на свой Ma c с homebrew с использованием:
brew install parallel
Вы можете затем изменить мою программу выше, чтобы она принимала имя файла в качестве параметра вместо жестко закодированного имени файла и команду для их выполнения. параллельно:
parallel --dry-run script.py {} ::: *.IMG
Для еще больших усилий вы можете сделать это еще быстрее, поместив приведенный выше код в функцию и вызвав функцию для каждого файла, указанного в качестве параметра. Таким образом, вы можете не запускать новый интерпретатор Python для каждого изображения и указывать GNU Parallel на передачу как можно большего количества файлов на каждый вызов вашего сценария, например:
parallel -X --dry-run script.py ::: *.IMG
Структура скрипта выглядит следующим образом:
def processOne(filename):
open, read, search, extract, save as per my code above
# Main - process all filenames received as parameters
for filename in sys.argv[1:]:
processOne(filename)