feat: initial commit - Jhonny Editor
- Adicionado estrutura completa do projeto - Configurado MCP server para Premiere Pro - Adicionado documentação e skills - Configurado Gitignore para o projeto
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Compara o pixel medio de dois PNGs (palette grossa, suficiente p/ conferir se o icns e o mesmo desenho)."""
|
||||
import struct
|
||||
import sys
|
||||
import zlib
|
||||
|
||||
|
||||
def read_png(path):
|
||||
d = open(path, 'rb').read()
|
||||
assert d[:8] == b'\x89PNG\r\n\x1a\n', f'nao e PNG: {path}'
|
||||
pos, w, h = 8, None, None
|
||||
idat = b''
|
||||
while pos < len(d):
|
||||
ln = struct.unpack('>I', d[pos:pos+4])[0]
|
||||
typ = d[pos+4:pos+8]
|
||||
data = d[pos+8:pos+8+ln]
|
||||
if typ == b'IHDR':
|
||||
w, h = struct.unpack('>II', data[:8])
|
||||
elif typ == b'IDAT':
|
||||
idat += data
|
||||
pos += 12 + ln
|
||||
if typ == b'IEND':
|
||||
break
|
||||
raw = zlib.decompress(idat)
|
||||
assert w is not None
|
||||
stride = w * 4 + 1
|
||||
prev = bytearray(w * 4)
|
||||
out = bytearray()
|
||||
for y in range(h):
|
||||
row = bytearray(raw[y*stride:(y+1)*stride])
|
||||
f = row[0]
|
||||
line = bytearray(row[1:])
|
||||
for x in range(w):
|
||||
for k in range(4):
|
||||
i = x * 4 + k
|
||||
a = line[i-4] if x > 0 and k < 3 else 0 # aprox: usa vizinho p/ filtros
|
||||
b = prev[i]
|
||||
c = line[i-4] if x > 0 else 0
|
||||
if f == 1:
|
||||
v = (line[i] + (line[i-4] if x > 0 else 0)) & 255
|
||||
elif f == 2:
|
||||
v = (line[i] + prev[i]) & 255
|
||||
elif f == 3:
|
||||
v = (line[i] + ((a + b) >> 1)) & 255
|
||||
elif f == 4:
|
||||
p = a + b - c
|
||||
pa, pb, pc = abs(p-a), abs(p-b), abs(p-c)
|
||||
pr = a if (pa <= pb and pa <= pc) else (b if pb <= pc else c)
|
||||
v = (line[i] + pr) & 255
|
||||
else:
|
||||
v = line[i]
|
||||
line[i] = v
|
||||
out += line
|
||||
prev = line
|
||||
return w, h, out
|
||||
|
||||
|
||||
def average(path):
|
||||
w, h, px = read_png(path)
|
||||
n = w * h
|
||||
r = sum(px[i] for i in range(0, len(px), 4)) // n
|
||||
g = sum(px[i] for i in range(1, len(px), 4)) // n
|
||||
b = sum(px[i] for i in range(2, len(px), 4)) // n
|
||||
opaque = sum(1 for i in range(3, len(px), 4) if px[i] > 200) * 100 // n
|
||||
return w, h, r, g, b, f'{opaque}% opaco'
|
||||
|
||||
|
||||
def main():
|
||||
icns_png = sys.argv[1] # 1024 extraido do .icns
|
||||
orig_png = sys.argv[2] # PNG original do usuario
|
||||
a = average(icns_png)
|
||||
b = average(orig_png)
|
||||
print(f'icns 1024 -> {a}')
|
||||
print(f'original -> {b}')
|
||||
# Mesmo desenho se cores medias proximas e ambos coloridos/transparentes com padrao similar
|
||||
close = abs(a[2]-b[2]) <= 24 and abs(a[3]-b[3]) <= 24 and abs(a[4]-b[4]) <= 24
|
||||
print('MATCH (mesmo desenho)' if close else 'DIFF — verificar manualmente')
|
||||
sys.exit(0 if close else 1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user