AI Smart Farm Studio

이미지 생성

📊 생성 통계

총 생성:
0
저장됨:
0

생성된 이미지

생성된 이미지가 여기에 표시됩니다

왼쪽 패널에서 설명을 입력하고 생성 버튼을 눌러보세요

// 텍스트 추가 ctx.fillStyle = 'rgba(255, 255, 255, 0.8)'; ctx.font = 'bold 20px "Noto Sans KR"'; ctx.textAlign = 'center'; ctx.fillText('🌱 DEMO IMAGE 🌱', 256, 200); ctx.font = '16px "Noto Sans KR"'; // 프롬프트 텍스트를 여러 줄로 분할 const words = prompt.split(' '); const lines = []; let currentLine = ''; words.forEach(word => { const testLine = currentLine + word + ' '; const testWidth = ctx.measureText(testLine).width; if (testWidth > 400 && currentLine !== '') { lines.push(currentLine.trim()); currentLine = word + ' '; } else { currentLine = testLine; } }); lines.push(currentLine.trim()); lines.forEach((line, index) => { ctx.fillText(line, 256, 250 + (index * 25)); }); // 워터마크 ctx.font = '12px "Noto Sans KR"'; ctx.fillStyle = 'rgba(255, 255, 255, 0.6)'; ctx.fillText('AI Smart Farm Studio - Demo Mode', 256, 480); return canvas.toDataURL('image/png', 0.9); } // 이미지 표시 function displayGeneratedImage(imageUrl, prompt, time) { elements.imageDisplay.innerHTML = `${prompt}`; elements.imageDisplay.classList.add('has-image'); elements.currentPrompt.textContent = prompt; elements.generationTime.textContent = `생성 시간: ${time}ms (데모 모드)`; elements.imageActions.classList.remove('hidden'); elements.imageInfo.classList.remove('hidden'); } // 갤러리 저장 function saveToGallery() { if (!currentImageUrl) return showToast('저장할 이미지가 없습니다.', 'warning'); const gallery = getGallery(); gallery.unshift({ id: Date.now(), imageUrl: currentImageUrl, prompt: currentPromptText, createdAt: new Date().toISOString(), isDemo: true }); localStorage.setItem(STORAGE_KEYS.GALLERY, JSON.stringify(gallery)); savedCount++; updateStats(); elements.saveBtn.disabled = true; elements.saveBtn.innerHTML = '저장됨'; elements.saveBtn.classList.replace('bg-emerald-500', 'bg-gray-400'); showToast('데모 이미지 저장 완료!', 'success'); if (elements.galleryView.classList.contains('hidden')) setTimeout(resetSaveButton, 2000); } function resetSaveButton() { elements.saveBtn.disabled = false; elements.saveBtn.innerHTML = '갤러리에 저장'; elements.saveBtn.classList.replace('bg-gray-400', 'bg-emerald-500'); } // 이미지 다운로드 function downloadImage() { if (!currentImageUrl) return showToast('다운로드할 이미지가 없습니다.', 'warning'); const link = document.createElement('a'); link.href = currentImageUrl; link.download = `smartfarm_demo_${Date.now()}.png`; document.body.appendChild(link); link.click(); document.body.removeChild(link); showToast('데모 이미지 다운로드 완료!', 'success'); } // 갤러리 관리 function getGallery() { return JSON.parse(localStorage.getItem(STORAGE_KEYS.GALLERY)) || []; } function loadGallery() { const gallery = getGallery(); elements.galleryGrid.innerHTML = ''; if (gallery.length === 0) { elements.galleryPlaceholder.classList.remove('hidden'); elements.clearGalleryBtn.classList.add('hidden'); } else { elements.galleryPlaceholder.classList.add('hidden'); elements.clearGalleryBtn.classList.remove('hidden'); gallery.forEach((item, index) => { const div = document.createElement('div'); div.className = 'gallery-item aspect-square bg-gray-200 slide-in'; div.style.animationDelay = `${index * 0.1}s`; div.innerHTML = ` ${item.prompt}

${item.prompt}

${formatDate(item.createdAt)}

${item.isDemo ? '

DEMO

' : ''}
`; elements.galleryGrid.appendChild(div); }); } } window.deleteGalleryItem = function(id) { if (!confirm('삭제하시겠습니까?')) return; const gallery = getGallery().filter(item => item.id != id); localStorage.setItem(STORAGE_KEYS.GALLERY, JSON.stringify(gallery)); savedCount = gallery.length; updateStats(); loadGallery(); showToast('삭제 완료!', 'info'); }; window.downloadGalleryImage = function(imageUrl, id) { const link = document.createElement('a'); link.href = imageUrl; link.download = `smartfarm_gallery_${id}.png`; document.body.appendChild(link); link.click(); document.body.removeChild(link); showToast('다운로드 완료!', 'success'); }; function clearGallery() { if (!confirm('모든 갤러리 이미지를 삭제하시겠습니까?')) return; localStorage.removeItem(STORAGE_KEYS.GALLERY); savedCount = 0; updateStats(); loadGallery(); showToast('갤러리가 비워졌습니다!', 'info'); } // 통계 관리 function getStats() { return JSON.parse(localStorage.getItem(STORAGE_KEYS.STATS)) || { totalGenerated: 0, totalSaved: 0 }; } function loadStats() { const stats = getStats(); generationCount = stats.totalGenerated; savedCount = stats.totalSaved; updateStatsDisplay(); } function updateStats() { localStorage.setItem(STORAGE_KEYS.STATS, JSON.stringify({ totalGenerated: generationCount, totalSaved: savedCount })); updateStatsDisplay(); } function updateStatsDisplay() { elements.totalGenerated.textContent = generationCount; elements.totalSaved.textContent = savedCount; } // 유틸리티 function formatDate(dateString) { const date = new Date(dateString); const diffDays = Math.floor((new Date() - date) / (1000 * 60 * 60 * 24)); return diffDays < 1 ? '오늘' : diffDays === 1 ? '어제' : diffDays < 7 ? `${diffDays}일 전` : date.toLocaleDateString('ko-KR'); } // 키보드 단축키 document.addEventListener('keydown', (e) => { if (e.ctrlKey && e.key === 'Enter' && !elements.generateBtn.disabled) generateImage(); if (e.ctrlKey && e.key === 's' && currentImageUrl) { e.preventDefault(); saveToGallery(); } if (e.ctrlKey && e.key === 'd' && currentImageUrl) { e.preventDefault(); downloadImage(); } if (e.altKey && e.key === 'Tab') { e.preventDefault(); switchView(elements.generatorView.classList.contains('hidden') ? 'generator' : 'gallery'); } }); // 반응형 처리 function handleResize() { const isMobile = window.innerWidth < 768; elements.galleryGrid.className = `grid ${isMobile ? 'grid-cols-2' : 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5'} gap-6`; } // 보안 알림 표시 setTimeout(() => { showToast('보안 업데이트: 외부 API 연결이 차단되어 데모 모드로 작동합니다.', 'warning'); }, 2000); init(); console.log('🔒 AI Smart Farm Studio 초기화 완료 (보안 모드)'); console.log('💡 팁: Ctrl+Enter 생성, Ctrl+S 저장, Ctrl+D 다운로드, Alt+Tab 뷰 전환'); console.log('🛡️ 보안: 모든 외부 API 호출이 제거되었습니다.');