다모앙 이미지 업로드 시 미리보기, 클립보드 붙여넣기, 드래그드랍 기능 확장 (Tampermonkey)

알림
|
X

페이지 정보

작성자 LiNE 210.♡.102.188
작성일 2024.08.12 17:38
분류 다모앙
361 조회
2 추천
쓰기 분류

본문

tampermonkey 스크립트이므로 해당 확장이 필요합니다.

 : https://chromewebstore.google.com/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo


기능 소개:

1. 이미지 미리보기, 드래그드랍 영역을 추가합니다.



2. 이미지 선택 및 붙여넣기, 드래그드랍 시 미리보기를 표시합니다.



3. 드래그 시 테두리가 파랗게 변하며 드랍 하면 이미지가 자동으로 선택됩니다.

 - 사이트 이미지를 그대로 드래그해도 동작하나 이 경우 새 창으로 이미지가 하나 더 뜨게 됩니다. (해결 중)



4. 클립보드에 이미지가 있을 경우 붙여넣기 하면 해당 이미지를 추가합니다. (GIF 미지원)

 - 2번 설명 이미지 참조

 - 해당 기능 동작을 위해서는 미리 보기 영역을 한번 클릭해야 합니다. (한번 클릭 후 Ctrl + V)


소스코드는 댓글에...

댓글 2 / 1 페이지

LiNE님의 댓글

작성자 LiNE (210.♡.102.188)
작성일 08.12 17:38
// ==UserScript==
// @name        다모앙 이미지 클립보드 붙여넣기 및 드래그드롭, 미리보기 기능
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  damoang.net의 이미지 업로드 페이지에서 클립보드 붙여넣기 및 드래그드롭과 이미지 미리보기 기능을 생성합니다.
// @author      LiNE
// @match        *://*.damoang.net/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const uploadForm = document.getElementById('na_upload_form');
    const fileInput = document.getElementById('na_upload_file');
    if (!uploadForm || !fileInput) {
        return; // 폼이나 파일 입력 필드가 없으면 스크립트를 중단
    }

    // 미리보기 설명 텍스트 추가
    const previewText = document.createElement('div');
    previewText.className = 'form-text';
    previewText.innerHTML = '<i class="bi bi-check2-circle"></i> 이미지 미리보기:';
    uploadForm.appendChild(previewText);

    // 미리보기 영역 추가 (배경색 포함)
    const previewContainer = document.createElement('div');
    previewContainer.id = 'clipboard-image-preview';
    previewContainer.style.marginTop = '10px';
    previewContainer.style.padding = '10px';
    previewContainer.style.border = '1px solid #ddd';
    previewContainer.style.backgroundColor = '#f9f9f9';
    previewContainer.style.width = '100%';
    previewContainer.style.height = '250px'; // 기본 높이를 250px로 설정
    previewContainer.style.display = 'flex';
    previewContainer.style.alignItems = 'center';
    previewContainer.style.justifyContent = 'center';
    previewContainer.style.color = '#ccc';
    previewContainer.style.overflow = 'hidden';  // 스크롤바 표시를 위한 초기 설정
    previewContainer.style.maxHeight = '80vh'; // 페이지의 80% 높이를 최대 높이로 설정
    previewContainer.innerHTML = '여기에 이미지를 붙여넣기 (영역 클릭 후 Ctrl + V) 또는 드래그 앤 드롭하세요';
    uploadForm.appendChild(previewContainer);

    function displayImagePreview(blob) {
        const img = document.createElement('img');
        img.style.maxWidth = '100%';  // 좌우 여백을 확보하기 위해 이미지 폭을 줄임
        img.style.height = 'auto'; // 이미지 높이를 자동 조정

        const reader = new FileReader();
        reader.onload = function(e) {
            img.src = e.target.result;
            previewContainer.innerHTML = '';  // 이전 텍스트를 지웁니다.
            previewContainer.appendChild(img);

            img.onload = function() {
                const imgHeight = img.height;
                const maxHeight = window.innerHeight * 0.8;

                if (imgHeight > 250) {
                    // 이미지 높이가 250px을 초과하면 컨테이너 높이를 이미지에 맞춰 조정
                    previewContainer.style.height = imgHeight + 'px';
                    previewContainer.style.overflow = 'hidden';
                } else {
                    // 이미지 높이가 250px 이하인 경우, 컨테이너 높이를 250px로 유지
                    previewContainer.style.height = '250px';
                }

                // 만약 이미지가 너무 커서 컨테이너 높이가 페이지의 80%를 초과하면 스크롤바 표시
                if (imgHeight > maxHeight) {
                    previewContainer.style.height = maxHeight + 'px';
                    previewContainer.style.overflow = 'auto';
                }
            };
        };
        reader.readAsDataURL(blob);
    }

    // 클립보드에서 이미지 붙여넣기 이벤트
    document.addEventListener('paste', function(event) {
        const items = (event.clipboardData || event.originalEvent.clipboardData).items;
        for (let index in items) {
            const item = items[index];
            if (item.kind === 'file' && item.type.indexOf('image') !== -1) {
                const blob = item.getAsFile();
                displayImagePreview(blob);

                const dataTransfer = new DataTransfer();
                dataTransfer.items.add(new File([blob], 'clipboard-image.' + blob.type.split('/')[1], { type: blob.type }));
                fileInput.files = dataTransfer.files;

                break; // 하나의 이미지만 처리하도록 중지
            }
        }
    });

    // 파일 선택 시 이미지 미리보기
    fileInput.addEventListener('change', function(event) {
        const file = event.target.files[0];
        if (file && file.type.indexOf('image') !== -1) {
            displayImagePreview(file);
        }
    });

    // 드래그 앤 드롭으로 이미지 미리보기 제공
    previewContainer.addEventListener('dragover', function(event) {
        event.preventDefault(); // 기본 드래그 동작을 방지
        previewContainer.style.border = '2px solid #007bff'; // 드래그 중 부드러운 파란색 실선으로 표시
        previewContainer.style.backgroundColor = '#e9f7ff'; // 드래그 중 부드러운 배경색 추가
    });

    previewContainer.addEventListener('dragleave', function(event) {
        previewContainer.style.border = '1px solid #ddd'; // 드래그 종료 시 원래 스타일로 복구
        previewContainer.style.backgroundColor = '#f9f9f9'; // 드래그 종료 시 원래 배경색으로 복구
    });

    previewContainer.addEventListener('drop', function(event) {
        event.preventDefault(); // 기본 드롭 동작을 방지
        previewContainer.style.border = '1px solid #ddd'; // 드롭 시 원래 스타일로 복구
        previewContainer.style.backgroundColor = '#f9f9f9'; // 드롭 시 원래 배경색으로 복구

        const files = event.dataTransfer.files;
        if (files.length > 0 && files[0].type.indexOf('image') !== -1) {
            const file = files[0];
            displayImagePreview(file);

            const dataTransfer = new DataTransfer();
            dataTransfer.items.add(new File([file], file.name, { type: file.type }));
            fileInput.files = dataTransfer.files;
        }
    });

})();

humanitas님의 댓글

작성자 humanitas (78.♡.45.236)
작성일 08.12 22:33
스크립트 감사합니다.
쓰기 분류
홈으로 전체메뉴 마이메뉴 새글/새댓글
전체 검색