v0.2.0: photo mosaic 2x resolution + version bump

- mosaic: resolution slider up to 192 cols (was 96), default 96, output canvas cap 3600px
  so higher density renders/saves at genuinely higher resolution

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 16:25:30 +09:00
parent d2546f9cbf
commit 20cec8cb00
3 changed files with 6 additions and 5 deletions
+1 -1
View File
@@ -7,5 +7,5 @@
"corePurpose": "", "corePurpose": "",
"detailLevel": "standard", "detailLevel": "standard",
"createdAt": "2026-06-01T04:16:09.722Z", "createdAt": "2026-06-01T04:16:09.722Z",
"updatedAt": "2026-06-02T05:39:25.175Z" "updatedAt": "2026-06-02T07:18:12.522Z"
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ai-photo-organizer", "name": "ai-photo-organizer",
"version": "0.1.0", "version": "0.2.0",
"description": "Local-first AI photo organizer — face recognition + EXIF based auto archiving", "description": "Local-first AI photo organizer — face recognition + EXIF based auto archiving",
"author": "PhotoAI", "author": "PhotoAI",
"license": "MIT", "license": "MIT",
+4 -3
View File
@@ -41,7 +41,7 @@ export function MosaicView(props: {
const poolRef = useRef<Tile[]>([]) const poolRef = useRef<Tile[]>([])
const targetImgRef = useRef<HTMLImageElement | null>(null) const targetImgRef = useRef<HTMLImageElement | null>(null)
const [ready, setReady] = useState(false) const [ready, setReady] = useState(false)
const [cols, setCols] = useState(48) const [cols, setCols] = useState(96)
const [blend, setBlend] = useState(0.35) const [blend, setBlend] = useState(0.35)
const [unique, setUnique] = useState(true) const [unique, setUnique] = useState(true)
@@ -89,7 +89,8 @@ export function MosaicView(props: {
sctx.drawImage(tImg, 0, 0, gridCols, gridRows) sctx.drawImage(tImg, 0, 0, gridCols, gridRows)
const cells = sctx.getImageData(0, 0, gridCols, gridRows).data const cells = sctx.getImageData(0, 0, gridCols, gridRows).data
const cellPx = Math.max(8, Math.round(1800 / gridCols)) // 출력 캔버스 상한 3600px → 해상도(열 수)를 높여도 타일이 뭉개지지 않고 고해상도로 저장
const cellPx = Math.max(8, Math.round(3600 / gridCols))
canvas.width = gridCols * cellPx canvas.width = gridCols * cellPx
canvas.height = gridRows * cellPx canvas.height = gridRows * cellPx
const ctx = canvas.getContext('2d')! const ctx = canvas.getContext('2d')!
@@ -185,7 +186,7 @@ export function MosaicView(props: {
<input <input
type="range" type="range"
min={16} min={16}
max={96} max={192}
step={2} step={2}
value={cols} value={cols}
onChange={(e) => setCols(Number(e.target.value))} onChange={(e) => setCols(Number(e.target.value))}