博客 / 詳情

返回

上傳圖片修改透明邊距並下載下來

功能

允許用户上傳圖片,並在圖片周圍添加透明邊距。用户可以調整邊距的大小,然後將修改後的圖片下載為PNG格式。

思路

  1. HTML結構:包含一個畫布(Canvas)用於顯示圖片,以及一些輸入框和按鈕用於調整邊距和下載圖片。
  2. CSS樣式:定義了頁面的基本佈局和樣式,使頁面居中顯示,並設置了畫布的大小和邊框。
  3. JavaScript功能:
    • 處理圖片上傳。
    • 允許用户調整圖片周圍的邊距。
    • 將修改後的圖片繪製到畫布上。
    • 提供下載修改後圖片的功能。

實現

HTML結構

添加 元素、輸入框(左、上、右、下邊距)、文件上傳輸入框、下載按鈕

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>圖片修改透明邊距</title>
    <style>
      body {
        text-align: center;
      }
      .main {
        display: inline-block;
        text-align: left;
      }
      #myCanvas {
        width: 256px;
        height: 256px;
        object-fit: contain;
        outline: 1px solid #ccc;
      }
    </style>
</head>
<body>
    <div class="main">
      <canvas id="myCanvas" width="400" height="400"></canvas>
      <br>
      左邊距:<input type="number" placeholder="10" onchange="margin.left = Number(this.value);drawImage(IMAGE)">&nbsp;px
      <br>
      上邊距:<input type="number" placeholder="10" onchange="margin.top = Number(this.value);drawImage(IMAGE)">&nbsp;px
      <br>
      右邊距:<input type="number" placeholder="10" onchange="margin.right = Number(this.value);drawImage(IMAGE)">&nbsp;px
      <br>
      下邊距:<input type="number" placeholder="10" onchange="margin.bottom = Number(this.value);drawImage(IMAGE)">&nbsp;px
      <br>
      <input type="file" id="imageUpload" accept="image/*" />
      <br>
      <button id="downloadButton">下載PNG</button>
    </div>
</body>
</html>

JavaScript

獲取canvas元素和canvas渲染上下文,添加邊距圖片變量,文件上傳輸入框添加change事件,使用fileReader獲取圖片,根據獲取到的圖片大小和邊距大小計算出canvas大小並設置,下載按鈕添加點擊事件

<script>
    // 獲取Canvas元素
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');

    // 邊距
    const margin = {
      left: 10,
      top: 10,
      right: 10,
      bottom: 10
    };
    let IMAGE = null;

    // 獲取文件上傳輸入框
    const imageUpload = document.getElementById('imageUpload');
    // 監聽文件上傳事件
    imageUpload.addEventListener('change', function(event) {
        // 獲取用户選擇的文件
        const file = event.target.files[0];

        // 檢查是否選擇了文件
        if (!file) {
            alert('未選擇文件!');
            return;
        }

        // 檢查文件類型是否為圖片
        if (!file.type.startsWith('image/')) {
            alert('請選擇圖片文件!');
            return;
        }

        // 使用FileReader讀取圖片文件
        const reader = new FileReader();
        reader.onload = function(e) {
            // 創建一個Image對象
            const image = new Image();
            IMAGE = image;

            // 設置圖片加載完成後的回調函數
            image.onload = function() {
              drawImage(image)
            };

            // 設置圖片的源為FileReader讀取的結果
            image.src = e.target.result;
        };

        // 讀取文件內容為DataURL
        reader.readAsDataURL(file);
    });

    function drawImage(image) {
      if (!image) {
        return
      }
      const canvasWidth = image.width +  + margin.left + margin.right
      const canvasHeight = image.height + margin.top + margin.bottom
      canvas.width = canvasWidth
      canvas.height = canvasHeight
      console.log(canvasWidth, canvasHeight)
      console.log(image.width, image.height)
      console.log(margin)
      // 清空Canvas
      ctx.clearRect(0, 0, canvasWidth, canvasHeight);
      // 繪製圖片到Canvas上
      ctx.drawImage(image, margin.left, margin.top, image.width, image.height);
    }

    // 添加按鈕點擊事件
    document.getElementById('downloadButton').addEventListener('click', function() {
        if (!IMAGE) {
          alert('請先選擇圖片!')
          return
        }
        drawImage(IMAGE)

        // 將Canvas內容轉換為PNG數據URL
        const dataURL = canvas.toDataURL('image/png');

        // 創建一個a元素用於下載
        const link = document.createElement('a');
        link.href = dataURL;
        link.download = 'canvas_image.png'; // 設置下載文件名
        document.body.appendChild(link);

        // 模擬點擊a元素以觸發下載
        link.click();

        // 清理
        document.body.removeChild(link);
    });
</script>
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.