Added random dither and updated readme

This commit is contained in:
sloumdrone 2019-06-09 13:15:00 -07:00
parent ce837f1d7e
commit 2629d61866
2 changed files with 23 additions and 5 deletions

View File

@ -14,7 +14,7 @@ lid [option]... [source path] [output name]
Options:<br> Options:<br>
-f = output format, defaults to the recommended setting: png<br> -f = output format, defaults to the recommended setting: png<br>
-m = mode, available: o4, o9, e. default: o4.<br> -m = mode, available: o4, o9, e, t, r, a. default: o4.<br>
-q = quality (0 - 100), defaults to 90, only affects jpeg/jpg<br> -q = quality (0 - 100), defaults to 90, only affects jpeg/jpg<br>
-t = threshold (0 - 255), defaults to image average level. only affects dither mode 't' -t = threshold (0 - 255), defaults to image average level. only affects dither mode 't'
@ -28,6 +28,9 @@ Lid works best outputting png files from any input. You will get the smallest fi
#### t #### t
This is the lowest quality mode. It produces the smallest file, but at the cost of most detail. This is the lowest quality mode. It produces the smallest file, but at the cost of most detail.
#### r
Random dithering produces a fairly large file (comparable to error diffusion), without moving much closer to photographic quality. However, it does provide an interesting effect.
#### o4 #### o4
This mode is a noticable difference from the stark two tone appearance of threashold mode. The appearance 'gray' areas make for a slightly more photographic image. This mode is a noticable difference from the stark two tone appearance of threashold mode. The appearance 'gray' areas make for a slightly more photographic image.

23
lid
View File

@ -7,6 +7,7 @@
from PIL import Image from PIL import Image
import sys import sys
import os, os.path import os, os.path
from random import randint
class Dither: class Dither:
def __init__(self, data): def __init__(self, data):
@ -88,7 +89,14 @@ class Dither:
def random_dither(self): def random_dither(self):
pass print("Dither method: random\033[?25l".format(self.threshold))
for row in range(0, self.height):
for col in range(0, self.width):
px = self.get_pixel(col, row)
rand = randint(1,255)
self.new_pixels[col, row] = int(px > rand)
self.update_progress()
self.save_file()
def error_diffusion_dither(self): def error_diffusion_dither(self):
i = self.source_image.load() i = self.source_image.load()
@ -161,7 +169,7 @@ def display_help():
options: options:
-f output format. defaults to: png (recommended) -f output format. defaults to: png (recommended)
-m dither mode. defaults to: o4. other options: e, o9 -m dither mode. defaults to: o4. other options: e, o9, t, r, a
-q image quality. defaults to: 90. only has effect on png/jpg -q image quality. defaults to: 90. only has effect on png/jpg
-t threshold. default: image average tone. onls has effect in mode 't' -t threshold. default: image average tone. onls has effect in mode 't'
@ -179,6 +187,8 @@ def display_help():
the quality flag mostly seems to effect jpegs and does not do a whole the quality flag mostly seems to effect jpegs and does not do a whole
heap to PNG files, but play around with it as mileage may vary. heap to PNG files, but play around with it as mileage may vary.
to output an image with each type of dither, use mode a
""" """
print(helptext) print(helptext)
@ -226,8 +236,8 @@ def parse_input():
elif argmap["-f"] == "jpg": elif argmap["-f"] == "jpg":
argmap["-f"] = "jpeg" argmap["-f"] = "jpeg"
if not argmap["-m"] in ["o4", "e", "o9", "t", "a"]: if not argmap["-m"] in ["o4", "e", "o9", "t", "r", "a"]:
print("lid error: invalid dither mode provided for -m. Options: o4, o9, e. Default: o4") print("lid error: invalid dither mode provided for -m. Options: o4, o9, e, t, r, a. Default: o4")
return None return None
try: try:
@ -267,6 +277,8 @@ if __name__ == "__main__":
d.error_diffusion_dither() d.error_diffusion_dither()
elif request["-m"] == "t": elif request["-m"] == "t":
d.threshold_dither() d.threshold_dither()
elif request["-m"] == "r":
d.random_dither()
elif request["-m"] == "a": elif request["-m"] == "a":
name = request["out"] name = request["out"]
request["out"] = name + "_o4" request["out"] = name + "_o4"
@ -281,6 +293,9 @@ if __name__ == "__main__":
request["out"] = name + "_e" request["out"] = name + "_e"
d4 = Dither(request) d4 = Dither(request)
d4.error_diffusion_dither() d4.error_diffusion_dither()
request["out"] = name + "_r"
d4 = Dither(request)
d4.random_diffusion_dither()
else: else:
print("Unknown mode flag") print("Unknown mode flag")
sys.exit(2) sys.exit(2)