← back to Corkwallcovering
Crop PHILLIPE ROMANO logo-header band off 23 cork product images (Faguli + La Corka)
a6f5277c3d9a1c4ace092a1608355e0ea75a959e · 2026-06-30 16:11:08 -0700 · Steve
Files touched
M .gitignoreA data/cropped-manifest.jsonA public/cropped/faguli-real-cork-cork-34176.jpgA public/cropped/faguli-real-cork-cork-34177.jpgA public/cropped/faguli-real-cork-cork-34178.jpgA public/cropped/faguli-real-cork-cork-34179.jpgA public/cropped/faguli-real-cork-cork-34180.jpgA public/cropped/faguli-real-cork-cork-34181.jpgA public/cropped/faguli-real-cork-cork-34182.jpgA public/cropped/faguli-real-cork-cork-34183.jpgA public/cropped/faguli-real-cork-cork-34184.jpgA public/cropped/faguli-real-cork-cork-34185.jpgA public/cropped/la-corka-prt-74037.jpgA public/cropped/la-corka-prt-74039.jpgA public/cropped/la-corka-prt-74040.jpgA public/cropped/la-corka-prt-74041.jpgA public/cropped/la-corka-prt-74042.jpgA public/cropped/la-corka-prt-74047.jpgA public/cropped/la-corka-prt-74048.jpgA public/cropped/la-corka-prt-74050.jpgA public/cropped/la-corka-prt-74051.jpgA public/cropped/la-corka-prt-74052.jpgA public/cropped/la-corka-prt-74053.jpgA public/cropped/la-corka-prt-74055.jpgA public/cropped/la-corka-prt-74059.jpgA scripts/crop_cork_headers.pyA scripts/crop_logo_header.py
Diff
commit a6f5277c3d9a1c4ace092a1608355e0ea75a959e
Author: Steve <steve@designerwallcoverings.com>
Date: Tue Jun 30 16:11:08 2026 -0700
Crop PHILLIPE ROMANO logo-header band off 23 cork product images (Faguli + La Corka)
---
.gitignore | 2 +
data/cropped-manifest.json | 209 +++++++++++++++++++++++++
public/cropped/faguli-real-cork-cork-34176.jpg | Bin 0 -> 63193 bytes
public/cropped/faguli-real-cork-cork-34177.jpg | Bin 0 -> 89730 bytes
public/cropped/faguli-real-cork-cork-34178.jpg | Bin 0 -> 66903 bytes
public/cropped/faguli-real-cork-cork-34179.jpg | Bin 0 -> 70110 bytes
public/cropped/faguli-real-cork-cork-34180.jpg | Bin 0 -> 74195 bytes
public/cropped/faguli-real-cork-cork-34181.jpg | Bin 0 -> 66688 bytes
public/cropped/faguli-real-cork-cork-34182.jpg | Bin 0 -> 60851 bytes
public/cropped/faguli-real-cork-cork-34183.jpg | Bin 0 -> 76606 bytes
public/cropped/faguli-real-cork-cork-34184.jpg | Bin 0 -> 63531 bytes
public/cropped/faguli-real-cork-cork-34185.jpg | Bin 0 -> 67369 bytes
public/cropped/la-corka-prt-74037.jpg | Bin 0 -> 132692 bytes
public/cropped/la-corka-prt-74039.jpg | Bin 0 -> 130810 bytes
public/cropped/la-corka-prt-74040.jpg | Bin 0 -> 151277 bytes
public/cropped/la-corka-prt-74041.jpg | Bin 0 -> 141566 bytes
public/cropped/la-corka-prt-74042.jpg | Bin 0 -> 143436 bytes
public/cropped/la-corka-prt-74047.jpg | Bin 0 -> 165130 bytes
public/cropped/la-corka-prt-74048.jpg | Bin 0 -> 128041 bytes
public/cropped/la-corka-prt-74050.jpg | Bin 0 -> 130949 bytes
public/cropped/la-corka-prt-74051.jpg | Bin 0 -> 154648 bytes
public/cropped/la-corka-prt-74052.jpg | Bin 0 -> 133989 bytes
public/cropped/la-corka-prt-74053.jpg | Bin 0 -> 154429 bytes
public/cropped/la-corka-prt-74055.jpg | Bin 0 -> 165746 bytes
public/cropped/la-corka-prt-74059.jpg | Bin 0 -> 105223 bytes
scripts/crop_cork_headers.py | 79 ++++++++++
scripts/crop_logo_header.py | 77 +++++++++
27 files changed, 367 insertions(+)
diff --git a/.gitignore b/.gitignore
index 3a3ad0f..0caf456 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,3 +27,5 @@ out/
*.bak.*
*.bak-*
*.pre-*
+
+.image-cache/
diff --git a/data/cropped-manifest.json b/data/cropped-manifest.json
new file mode 100644
index 0000000..b33e429
--- /dev/null
+++ b/data/cropped-manifest.json
@@ -0,0 +1,209 @@
+[
+ {
+ "sku": "faguli-real-cork-cork-34178",
+ "handle": "faguli-real-cork-cork-34178",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/43a2aa9b40b4e3e80fad9f478a92f125_c9e2a136-03a2-4d8d-bb78-72f1675aac0e.jpg?v=1745457023",
+ "cropped_file": "cropped/faguli-real-cork-cork-34178.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34176",
+ "handle": "faguli-real-cork-cork-34176",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/e018f8a3dfd210857fe67c8b2b7ba357_0058d1ca-0dcb-4949-ba4e-c4a53aa8816c.jpg?v=1745457027",
+ "cropped_file": "cropped/faguli-real-cork-cork-34176.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34183",
+ "handle": "faguli-real-cork-cork-34183",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/5f56df919efeaf3368db50a01fc05cb2_5b979270-553c-492a-9ff6-9162e861ebef.jpg?v=1745457013",
+ "cropped_file": "cropped/faguli-real-cork-cork-34183.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34185",
+ "handle": "faguli-real-cork-cork-34185",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/3ba26b0a8af19094f37c2db0694fc60c_06c69f17-bd41-4986-9096-2726b266727d.jpg?v=1745457009",
+ "cropped_file": "cropped/faguli-real-cork-cork-34185.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34181",
+ "handle": "faguli-real-cork-cork-34181",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/e0e4f3337edc54c774e4347f527ecd75_54967173-52a3-4d8c-b823-32907798a9da.jpg?v=1745457017",
+ "cropped_file": "cropped/faguli-real-cork-cork-34181.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34180",
+ "handle": "faguli-real-cork-cork-34180",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/2113990fe114e980f1d501fb7f069f4e_93f78c72-f9c5-4e78-a698-6af0284dd4bd.jpg?v=1745457019",
+ "cropped_file": "cropped/faguli-real-cork-cork-34180.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34179",
+ "handle": "faguli-real-cork-cork-34179",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/622d2e0a9a2032b11d3d8c9e012afd04_d66944e1-c338-4382-88e8-66a79917757c.jpg?v=1745457021",
+ "cropped_file": "cropped/faguli-real-cork-cork-34179.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34177",
+ "handle": "faguli-real-cork-cork-34177",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/4a10302ba32ad9bebb385088c0b1c8d5_6639e138-54b9-47e9-b6d1-ba61a9541b9e.jpg?v=1745457025",
+ "cropped_file": "cropped/faguli-real-cork-cork-34177.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34184",
+ "handle": "faguli-real-cork-cork-34184",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/f88d206c12f2405f59d494ba116994a7_3233a3d0-5f59-4096-9417-24fcbfd42586.jpg?v=1745457011",
+ "cropped_file": "cropped/faguli-real-cork-cork-34184.jpg"
+ },
+ {
+ "sku": "faguli-real-cork-cork-34182",
+ "handle": "faguli-real-cork-cork-34182",
+ "vendor": "Phillipe Romano",
+ "band_row": 98,
+ "frac": 0.196,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/b4f9a63f50e48cc51b575fc15b1f9305_133f25f8-54d8-428b-964f-45a5c880b93d.jpg?v=1745457015",
+ "cropped_file": "cropped/faguli-real-cork-cork-34182.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74040",
+ "handle": "la-corka-prt-74040",
+ "vendor": "Phillipe Romano",
+ "band_row": 156,
+ "frac": 0.195,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/f17920060be22c14011d9b8693933060.jpg?v=1745456184",
+ "cropped_file": "cropped/la-corka-prt-74040.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74041",
+ "handle": "la-corka-prt-74041",
+ "vendor": "Phillipe Romano",
+ "band_row": 156,
+ "frac": 0.195,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/66c1f555d63f11648f31137f661dbe27.jpg?v=1745456181",
+ "cropped_file": "cropped/la-corka-prt-74041.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74048",
+ "handle": "la-corka-prt-74048",
+ "vendor": "Phillipe Romano",
+ "band_row": 156,
+ "frac": 0.195,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/367de05b47ed67a63e79363cadf9f203.jpg?v=1745456166",
+ "cropped_file": "cropped/la-corka-prt-74048.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74039",
+ "handle": "la-corka-prt-74039",
+ "vendor": "Phillipe Romano",
+ "band_row": 156,
+ "frac": 0.195,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/0d57e40ef1d2e8127a4c2f4723fe621d.jpg?v=1745456186",
+ "cropped_file": "cropped/la-corka-prt-74039.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74050",
+ "handle": "la-corka-prt-74050",
+ "vendor": "Phillipe Romano",
+ "band_row": 185,
+ "frac": 0.2313,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/676a51eb91ea689a8faf7da1246860ef.jpg?v=1745456161",
+ "cropped_file": "cropped/la-corka-prt-74050.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74037",
+ "handle": "la-corka-prt-74037",
+ "vendor": "Phillipe Romano",
+ "band_row": 157,
+ "frac": 0.1963,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/7038db2ed0703f48b8e56ce0142d2ac8.jpg?v=1745456191",
+ "cropped_file": "cropped/la-corka-prt-74037.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74055",
+ "handle": "la-corka-prt-74055",
+ "vendor": "Phillipe Romano",
+ "band_row": 189,
+ "frac": 0.2362,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/60f2f021774d2b25bfb4b238d7493131.jpg?v=1745456150",
+ "cropped_file": "cropped/la-corka-prt-74055.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74052",
+ "handle": "la-corka-prt-74052",
+ "vendor": "Phillipe Romano",
+ "band_row": 157,
+ "frac": 0.1963,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/058a2415387a12f5153beb947a24e0d9.jpg?v=1745456157",
+ "cropped_file": "cropped/la-corka-prt-74052.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74059",
+ "handle": "la-corka-prt-74059",
+ "vendor": "Phillipe Romano",
+ "band_row": 157,
+ "frac": 0.1963,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/2e0c1bae163e2a484be0c9a47449f403.jpg?v=1745456141",
+ "cropped_file": "cropped/la-corka-prt-74059.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74053",
+ "handle": "la-corka-prt-74053",
+ "vendor": "Phillipe Romano",
+ "band_row": 166,
+ "frac": 0.2075,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/c305292ba73b06e8617f42b37487dd4f.jpg?v=1745456154",
+ "cropped_file": "cropped/la-corka-prt-74053.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74051",
+ "handle": "la-corka-prt-74051",
+ "vendor": "Phillipe Romano",
+ "band_row": 156,
+ "frac": 0.195,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/0a7d319a25a554a9ac146d27d82d5f2a.jpg?v=1745456159",
+ "cropped_file": "cropped/la-corka-prt-74051.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74047",
+ "handle": "la-corka-prt-74047",
+ "vendor": "Phillipe Romano",
+ "band_row": 156,
+ "frac": 0.195,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/bc112f88c065de11d24240a96af1b638.jpg?v=1745456168",
+ "cropped_file": "cropped/la-corka-prt-74047.jpg"
+ },
+ {
+ "sku": "la-corka-prt-74042",
+ "handle": "la-corka-prt-74042",
+ "vendor": "Phillipe Romano",
+ "band_row": 157,
+ "frac": 0.1963,
+ "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/2097cd68e3568c7c8ba10a780f05dfe4.jpg?v=1745456179",
+ "cropped_file": "cropped/la-corka-prt-74042.jpg"
+ }
+]
\ No newline at end of file
diff --git a/public/cropped/faguli-real-cork-cork-34176.jpg b/public/cropped/faguli-real-cork-cork-34176.jpg
new file mode 100644
index 0000000..6b3ee95
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34176.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34177.jpg b/public/cropped/faguli-real-cork-cork-34177.jpg
new file mode 100644
index 0000000..6999fbc
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34177.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34178.jpg b/public/cropped/faguli-real-cork-cork-34178.jpg
new file mode 100644
index 0000000..160eea4
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34178.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34179.jpg b/public/cropped/faguli-real-cork-cork-34179.jpg
new file mode 100644
index 0000000..95382b0
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34179.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34180.jpg b/public/cropped/faguli-real-cork-cork-34180.jpg
new file mode 100644
index 0000000..ab72c35
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34180.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34181.jpg b/public/cropped/faguli-real-cork-cork-34181.jpg
new file mode 100644
index 0000000..823d069
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34181.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34182.jpg b/public/cropped/faguli-real-cork-cork-34182.jpg
new file mode 100644
index 0000000..38325b6
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34182.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34183.jpg b/public/cropped/faguli-real-cork-cork-34183.jpg
new file mode 100644
index 0000000..4118055
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34183.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34184.jpg b/public/cropped/faguli-real-cork-cork-34184.jpg
new file mode 100644
index 0000000..4626925
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34184.jpg differ
diff --git a/public/cropped/faguli-real-cork-cork-34185.jpg b/public/cropped/faguli-real-cork-cork-34185.jpg
new file mode 100644
index 0000000..07cd4bb
Binary files /dev/null and b/public/cropped/faguli-real-cork-cork-34185.jpg differ
diff --git a/public/cropped/la-corka-prt-74037.jpg b/public/cropped/la-corka-prt-74037.jpg
new file mode 100644
index 0000000..d9a6589
Binary files /dev/null and b/public/cropped/la-corka-prt-74037.jpg differ
diff --git a/public/cropped/la-corka-prt-74039.jpg b/public/cropped/la-corka-prt-74039.jpg
new file mode 100644
index 0000000..0284169
Binary files /dev/null and b/public/cropped/la-corka-prt-74039.jpg differ
diff --git a/public/cropped/la-corka-prt-74040.jpg b/public/cropped/la-corka-prt-74040.jpg
new file mode 100644
index 0000000..f233ccc
Binary files /dev/null and b/public/cropped/la-corka-prt-74040.jpg differ
diff --git a/public/cropped/la-corka-prt-74041.jpg b/public/cropped/la-corka-prt-74041.jpg
new file mode 100644
index 0000000..6cc3abf
Binary files /dev/null and b/public/cropped/la-corka-prt-74041.jpg differ
diff --git a/public/cropped/la-corka-prt-74042.jpg b/public/cropped/la-corka-prt-74042.jpg
new file mode 100644
index 0000000..695f73d
Binary files /dev/null and b/public/cropped/la-corka-prt-74042.jpg differ
diff --git a/public/cropped/la-corka-prt-74047.jpg b/public/cropped/la-corka-prt-74047.jpg
new file mode 100644
index 0000000..cba5e79
Binary files /dev/null and b/public/cropped/la-corka-prt-74047.jpg differ
diff --git a/public/cropped/la-corka-prt-74048.jpg b/public/cropped/la-corka-prt-74048.jpg
new file mode 100644
index 0000000..0001931
Binary files /dev/null and b/public/cropped/la-corka-prt-74048.jpg differ
diff --git a/public/cropped/la-corka-prt-74050.jpg b/public/cropped/la-corka-prt-74050.jpg
new file mode 100644
index 0000000..1820413
Binary files /dev/null and b/public/cropped/la-corka-prt-74050.jpg differ
diff --git a/public/cropped/la-corka-prt-74051.jpg b/public/cropped/la-corka-prt-74051.jpg
new file mode 100644
index 0000000..6d2bc09
Binary files /dev/null and b/public/cropped/la-corka-prt-74051.jpg differ
diff --git a/public/cropped/la-corka-prt-74052.jpg b/public/cropped/la-corka-prt-74052.jpg
new file mode 100644
index 0000000..99940b4
Binary files /dev/null and b/public/cropped/la-corka-prt-74052.jpg differ
diff --git a/public/cropped/la-corka-prt-74053.jpg b/public/cropped/la-corka-prt-74053.jpg
new file mode 100644
index 0000000..84eec73
Binary files /dev/null and b/public/cropped/la-corka-prt-74053.jpg differ
diff --git a/public/cropped/la-corka-prt-74055.jpg b/public/cropped/la-corka-prt-74055.jpg
new file mode 100644
index 0000000..87c7d9c
Binary files /dev/null and b/public/cropped/la-corka-prt-74055.jpg differ
diff --git a/public/cropped/la-corka-prt-74059.jpg b/public/cropped/la-corka-prt-74059.jpg
new file mode 100644
index 0000000..57c0516
Binary files /dev/null and b/public/cropped/la-corka-prt-74059.jpg differ
diff --git a/scripts/crop_cork_headers.py b/scripts/crop_cork_headers.py
new file mode 100644
index 0000000..d18bcad
--- /dev/null
+++ b/scripts/crop_cork_headers.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+"""
+Batch: for every CORK product in data/products.json, download its image, detect
+the PHILLIPE ROMANO logo-header banner, and (if found) crop it off. Cropped
+files are saved into public/cropped/<sku>.jpg. Originals are downloaded to a
+cache dir. Remote-image, so re-hosting/replacing the live Shopify URL is a
+SEPARATE GATED prod step — this only produces local cropped files + a manifest.
+
+Usage:
+ python3 scripts/crop_cork_headers.py [--vendor "Phillipe Romano"] [--limit N]
+"""
+import os, sys, json, urllib.request, ssl
+from crop_logo_header import detect_band, crop
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+DATA = os.path.join(ROOT, 'data', 'products.json')
+CACHE = os.path.join(ROOT, '.image-cache') # gitignored originals
+OUTDIR = os.path.join(ROOT, 'public', 'cropped') # cropped results (served)
+MANIFEST = os.path.join(ROOT, 'data', 'cropped-manifest.json')
+
+vendor_filter = None
+limit = None
+args = sys.argv[1:]
+for i,a in enumerate(args):
+ if a == '--vendor': vendor_filter = args[i+1]
+ if a == '--limit': limit = int(args[i+1])
+
+def is_cork(p):
+ s = (str(p.get('handle',''))+' '+str(p.get('sku',''))+' '+str(p.get('title',''))).lower()
+ return 'cork' in s
+
+def main():
+ os.makedirs(CACHE, exist_ok=True)
+ os.makedirs(OUTDIR, exist_ok=True)
+ d = json.load(open(DATA))
+ cork = [p for p in d if is_cork(p)]
+ if vendor_filter:
+ cork = [p for p in cork if p.get('vendor') == vendor_filter]
+ if limit: cork = cork[:limit]
+
+ ctx = ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
+ manifest = []
+ cropped = downloaded = errors = nobanner = 0
+ for i, p in enumerate(cork):
+ sku = p.get('sku') or p.get('handle')
+ url = p.get('image_url')
+ if not url: continue
+ cachefile = os.path.join(CACHE, sku + '.jpg')
+ try:
+ if not os.path.exists(cachefile):
+ req = urllib.request.Request(url, headers={'User-Agent':'Mozilla/5.0'})
+ with urllib.request.urlopen(req, context=ctx, timeout=30) as r, open(cachefile,'wb') as f:
+ f.write(r.read())
+ downloaded += 1
+ except Exception as e:
+ errors += 1
+ print(f'[{i}] ERR download {sku}: {e}')
+ continue
+ try:
+ b, info = detect_band(cachefile)
+ except Exception as e:
+ errors += 1; print(f'[{i}] ERR detect {sku}: {e}'); continue
+ if b:
+ out = os.path.join(OUTDIR, sku + '.jpg')
+ crop(cachefile, out, b)
+ cropped += 1
+ manifest.append(dict(sku=sku, handle=p.get('handle'), vendor=p.get('vendor'),
+ band_row=b, frac=info.get('frac'),
+ image_url=url, cropped_file=f'cropped/{sku}.jpg'))
+ print(f'[{i}] CROP {sku} band@{b} ({info.get("frac")})')
+ else:
+ nobanner += 1
+ json.dump(manifest, open(MANIFEST,'w'), indent=2)
+ print(f'\n=== DONE === scanned={len(cork)} downloaded={downloaded} '
+ f'CROPPED={cropped} no-banner={nobanner} errors={errors}')
+ print('manifest ->', MANIFEST, '| cropped files ->', OUTDIR)
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/crop_logo_header.py b/scripts/crop_logo_header.py
new file mode 100644
index 0000000..a2ed02c
--- /dev/null
+++ b/scripts/crop_logo_header.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+"""
+Detect & crop the PHILLIPE ROMANO logo-header banner off the TOP of cork product
+images (corkwallcovering.com).
+
+The banner is a solid BLACK horizontal band flush to the top of the image,
+carrying the white/gold wordmark "PHILLIPE ROMANO / WALLPAPER - FABRICS -
+LOS ANGELES". It is visually unmistakable: the very top rows are ~100% black
+pixels (text sits inside the black field), and the band ends with a SHARP
+transition to bright cork texture.
+
+Signal (per-row, top region only):
+ dark_frac[r] = fraction of pixels in row r that are near-black (gray < DARK_T).
+ - A banner requires the very top to be a near-solid black band
+ (mean dark_frac over the first few rows >= TOP_REQ).
+ - The band bottom = first row, after the band, where dark_frac collapses to
+ ~0 (cork texture) and STAYS low for a sustained run.
+Safety:
+ - Band must be within [MIN_FRAC, MAX_FRAC] of height, else NO crop.
+ - If the top is not a solid black band, NO crop (image left untouched).
+ - Crop-only, never upscale. Add a tiny SAFETY_PAD downward so we never clip
+ into the product (errs toward leaving a sliver of band rather than product).
+"""
+import sys, numpy as np
+from PIL import Image
+
+DARK_T = 60 # pixel is "dark" if gray < this
+TOP_REQ = 0.85 # first TOP_ROWS must average >= this dark_frac to be a banner
+TOP_ROWS_F = 0.015 # fraction of height used as the "very top" probe (min 3 rows)
+LOW_T = 0.15 # dark_frac considered "product texture" below this
+RUN = 10 # sustained low rows required to confirm band end
+MIN_FRAC = 0.04
+MAX_FRAC = 0.30
+SAFETY_PAD = 0 # extra rows kept below boundary (transition row is product)
+
+def detect_band(path):
+ im = Image.open(path).convert('RGB')
+ a = np.asarray(im).astype(float)
+ h, w, _ = a.shape
+ gray = a.mean(axis=2)
+ df = (gray < DARK_T).mean(axis=1)
+
+ top_rows = max(3, int(h * TOP_ROWS_F))
+ if df[:top_rows].mean() < TOP_REQ:
+ return None, dict(reason='top is not a solid black banner',
+ top_darkfrac=round(float(df[:top_rows].mean()), 3))
+
+ # Walk down to find sustained product texture (band end).
+ boundary = None
+ limit = int(h * MAX_FRAC) + 1
+ for r in range(top_rows, limit):
+ if df[r] < LOW_T and (df[r:r+RUN] < LOW_T).all():
+ boundary = r
+ break
+ if boundary is None:
+ return None, dict(reason='no sharp band->texture transition within max_frac',
+ top_darkfrac=round(float(df[:top_rows].mean()), 3))
+
+ boundary = min(boundary + SAFETY_PAD, int(h * MAX_FRAC))
+ frac = boundary / h
+ if not (MIN_FRAC <= frac <= MAX_FRAC):
+ return None, dict(reason=f'band {frac:.2%} out of range', boundary=boundary)
+ return boundary, dict(frac=round(frac, 4),
+ top_darkfrac=round(float(df[:top_rows].mean()), 3))
+
+def crop(path, out, boundary):
+ im = Image.open(path)
+ w, h = im.size
+ im.crop((0, boundary, w, h)).save(out, quality=92)
+
+if __name__ == '__main__':
+ p = sys.argv[1]
+ b, info = detect_band(p)
+ print(p, '-> BAND row', b, info)
+ if b and len(sys.argv) > 2:
+ crop(p, sys.argv[2], b)
+ print('cropped ->', sys.argv[2])
← 1fbde20 cork: Phase 3 sips dominant-hex enrichment (359/367 SKUs, $0
·
back to Corkwallcovering
·
Re-host 23 logo-cropped cork images as live Shopify product 8d52027 →