fix: the single-color filter no longer takes line art for a blank image (#4483)
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 2s
CI and images / extension-test (push) Successful in 16s
CI and images / frontend-build (push) Successful in 21s
CI and images / backend-lint-and-test (push) Successful in 31s
CI and images / integration (push) Successful in 2m37s
CI and images / sign-extension (push) Successful in 2s
CI and images / build-agent (push) Successful in 5s
CI and images / build-web (push) Successful in 1m36s
CI and images / smoke-web (push) Successful in 56s
CI and images / promote (push) Successful in 2s
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 2s
CI and images / extension-test (push) Successful in 16s
CI and images / frontend-build (push) Successful in 21s
CI and images / backend-lint-and-test (push) Successful in 31s
CI and images / integration (push) Successful in 2m37s
CI and images / sign-extension (push) Successful in 2s
CI and images / build-agent (push) Successful in 5s
CI and images / build-web (push) Successful in 1m36s
CI and images / smoke-web (push) Successful in 56s
CI and images / promote (push) Successful in 2s
Five of Todding's Discord doodles (pencil lines on white, 3000px) were skipped on import as "single color", so their posts showed text and no image. The predicate sampled a 64px BILINEAR thumbnail, which blends thin strokes into the paper, and 0.95 "one color" is below how white a doodle is. - Sample 256x256 by NEAREST, so each sample is a real pixel. - Default threshold 0.995: blank means essentially blank. Migration 0116 moves a stored 0.95 (the old default) with it; the settings slider now spans 0.9-1 in 0.005 steps so the value is reachable. - The Cleanup audit shares the predicate, so it stops flagging sketches too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -40,3 +40,48 @@ def test_single_color_evaluate_handles_rgba_input():
|
||||
# Alpha channel should be ignored — only RGB matters for the rule.
|
||||
im = Image.new("RGBA", (50, 50), (100, 100, 100, 128))
|
||||
assert single_color.evaluate(im, threshold=0.9, tolerance=10) is True
|
||||
|
||||
|
||||
# -- line art is a drawing, not a blank (#4483) ---------------------------------
|
||||
|
||||
_T = 0.995 # the default since alembic 0116
|
||||
_TOL = 30
|
||||
|
||||
|
||||
def _doodle(size=(1500, 2000), lines=12):
|
||||
"""Pencil line art on white: a few thin dark strokes plus faint
|
||||
construction lines — a couple of percent ink, the rest paper."""
|
||||
from PIL import ImageDraw
|
||||
|
||||
im = Image.new("RGB", size, (255, 255, 255))
|
||||
draw = ImageDraw.Draw(im)
|
||||
w, h = size
|
||||
for i in range(lines):
|
||||
x = (i + 1) * w // (lines + 1)
|
||||
draw.line([(x, 0), (w - x, h)], fill=(70, 60, 60), width=3)
|
||||
draw.line([(0, (i + 1) * h // (lines + 1)), (w, h - x)], fill=(235, 235, 235), width=2)
|
||||
return im
|
||||
|
||||
|
||||
def test_line_art_on_white_is_not_single_color():
|
||||
"""Five of Todding's Discord doodles were skipped as blank: a smoothing
|
||||
64px thumbnail blended the strokes into the paper."""
|
||||
assert single_color.evaluate(_doodle(), threshold=_T, tolerance=_TOL) is False
|
||||
|
||||
|
||||
def test_a_blank_page_with_a_small_mark_is_still_single_color():
|
||||
from PIL import ImageDraw
|
||||
|
||||
im = Image.new("RGB", (1000, 1000), (250, 250, 250))
|
||||
ImageDraw.Draw(im).rectangle([480, 480, 520, 520], fill=(40, 40, 40))
|
||||
assert single_color.evaluate(im, threshold=_T, tolerance=_TOL) is True
|
||||
|
||||
|
||||
def test_a_noisy_solid_fill_is_still_single_color():
|
||||
"""JPEG noise on a placeholder stays inside the tolerance."""
|
||||
im = Image.new("RGB", (600, 600), (30, 90, 160))
|
||||
for i in range(0, 600 * 600, 7):
|
||||
x, y = i % 600, i // 600
|
||||
d = (i % 21) - 10
|
||||
im.putpixel((x, y), (30 + d, 90 + d, 160 + d))
|
||||
assert single_color.evaluate(im, threshold=_T, tolerance=_TOL) is True
|
||||
|
||||
Reference in New Issue
Block a user