2013-06-17 11:03:08 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
from __future__ import print_function
|
2013-12-07 09:49:43 +00:00
|
|
|
try:
|
|
|
|
from PIL import Image
|
|
|
|
except ImportError:
|
|
|
|
from monoPIL import Image
|
2013-06-17 11:03:08 +00:00
|
|
|
from argparse import ArgumentParser
|
|
|
|
from sys import stderr
|
2013-06-18 22:15:18 +00:00
|
|
|
import color
|
|
|
|
import grayscale
|
2013-06-17 11:03:08 +00:00
|
|
|
|
|
|
|
SSTV_MODULES = [color, grayscale]
|
|
|
|
|
2013-06-18 22:15:18 +00:00
|
|
|
|
2013-06-17 11:03:08 +00:00
|
|
|
def main():
|
2013-06-18 22:15:18 +00:00
|
|
|
module_map = build_module_map()
|
|
|
|
parser = ArgumentParser(
|
|
|
|
description='Converts an image to an SSTV modulated WAV file.')
|
|
|
|
parser.add_argument('img_file', metavar='image.png',
|
|
|
|
help='input image file name')
|
|
|
|
parser.add_argument('wav_file', metavar='output.wav',
|
|
|
|
help='output WAV file name')
|
|
|
|
parser.add_argument(
|
|
|
|
'--mode', dest='mode', default='MartinM1', choices=module_map,
|
|
|
|
help='image mode (default: Martin M1)')
|
|
|
|
parser.add_argument('--rate', dest='rate', type=int, default=48000,
|
|
|
|
help='sampling rate (default: 48000)')
|
|
|
|
parser.add_argument('--bits', dest='bits', type=int, default=16,
|
|
|
|
help='bits per sample (default: 16)')
|
2013-06-19 13:44:30 +00:00
|
|
|
parser.add_argument('--vox', dest='vox', action='store_true',
|
|
|
|
help='add VOX tones at the beginning')
|
2013-06-19 14:45:47 +00:00
|
|
|
parser.add_argument('--fskid', dest='fskid',
|
|
|
|
help='add FSKID at the end')
|
2013-06-24 15:05:21 +00:00
|
|
|
parser.add_argument('--chan', dest='chan', type=int,
|
|
|
|
help='number of channels (default: mono)')
|
2013-06-18 22:15:18 +00:00
|
|
|
args = parser.parse_args()
|
|
|
|
image = Image.open(args.img_file)
|
|
|
|
mode = module_map[args.mode]
|
|
|
|
if not all(i >= m for i, m in zip(image.size, (mode.WIDTH, mode.HEIGHT))):
|
|
|
|
print(('Image must be at least {m.WIDTH} x {m.HEIGHT} pixels '
|
|
|
|
'for mode {m.__name__}').format(m=mode), file=stderr)
|
|
|
|
raise SystemExit(1)
|
|
|
|
s = mode(image, args.rate, args.bits)
|
2013-06-19 13:44:30 +00:00
|
|
|
s.vox_enabled = args.vox
|
2013-06-19 14:45:47 +00:00
|
|
|
if args.fskid:
|
|
|
|
s.add_fskid_text(args.fskid)
|
2013-06-24 15:05:21 +00:00
|
|
|
if args.chan:
|
|
|
|
s.nchannels = args.chan
|
2013-06-18 22:15:18 +00:00
|
|
|
s.write_wav(args.wav_file)
|
|
|
|
|
2013-06-17 11:03:08 +00:00
|
|
|
|
|
|
|
def build_module_map():
|
2013-06-18 22:15:18 +00:00
|
|
|
module_map = {}
|
|
|
|
for module in SSTV_MODULES:
|
|
|
|
for mode in module.MODES:
|
|
|
|
module_map[mode.__name__] = mode
|
|
|
|
return module_map
|
2013-06-17 11:03:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2013-06-18 22:15:18 +00:00
|
|
|
main()
|