Cách chuyển đổi ảnh PNG sang JPEG bằng Go

Chuyển đổi ảnh rất quan trọng trong quá trình phát triển phần mềm. Dưới đây là hướng dẫn chi tiết cách chuyển ảnh PNG sang JPEG bằng Go.

Chuyển đổi định dạng ảnh trong Go

Chuyển đổi định dạng ảnh để mở rộng khả năng tương thích và xử lý ảnh hiệu quả trên các hệ thống khác nhau. Bạn có thể tối ưu hóa việc lưu trữ, truyền tải, kết xuất và chỉnh sửa hình ảnh bằng cách chuyển đổi định dạng của chúng.

Hiện có nhiều gói để chuyển đổi định dạng ảnh trong hệ sinh thái Go, và Golang cung cấp một gói ảnh để định dạng và chuyển đổi ảnh. Gói ảnh này cung cấp tính năng ảnh 2D, bao gồm giải mã, mã hóa, chỉnh lại kích thước và xoay ảnh.

Bắt đầu với image package

Biên soạn tài liệu với Go

Thư viện ảnh có sẵn trong Go cung cấp tính năng toàn diện để xử lý ảnh ở những định dạng khác nhau. Gói image cung cấp hỗ trợ đọc, viết và chỉnh sửa ảnh.

Package image hỗ trợ nhiều kiểu file và định dạng ảnh, bao gồm JPEG, PNG, GIF và BMP. Nó cho phép bạn đọc và giải mã ảnh từ file hoặc stream và mã hóa & ghi ảnh vào file hoặc stream. Điều này khiến việc xử lý các kiểu ảnh khác nhau trở nên dễ dàng trong Go.

Thư viện này cũng cung cấp tính năng mở rộng cho chỉnh sửa và xử lý ảnh. Gói image cung cấp các phương thức để truy cập từng pixel riêng lẻ, cho phép chỉnh sửa cấp thấp cho những nhiệm vụ như chỉnh sửa giá trị pixel hoặc áp dụng bộ lọc tùy biến.

Thêm vào đó, gói này hỗ trợ các mẫu màu sắc và cung cấp công cụ chuyển đổi giữa các đại diện màu sắc khác nhau. Điều này rất thuận tiện để làm việc với hình ảnh trong nhiều không gian màu khác nhau.

Chuyển đổi ảnh từ PNG sang JPEG

PNG và JPEG là những định dạng ảnh thông dụng. Mỗi định dạng có đặc điểm riêng. PNG là một định dạng lossless, thay thế cho GIF, hỗ trợ ảnh chất lượng cao với dữ liệu ảnh và độ trong suốt được bảo toàn. PNG phù hợp với những ảnh có các cạnh sắc nét, text hoặc vùng có màu đồng nhất.

Package image chứa các gói jpegpng mà bạn có thể dùng để chuyển đổi định dạng ảnh giữa hai định dạng khác nhau.

Bạn có thể viết một hàm để chuyển đổi ảnh PNG sang JPEG. Đây là ví dụ chấp nhận luồng dữ liệu byte ảnh làm đầu vào:

package main

import (
    "bytes"
    "fmt"
    "image/jpeg"
    "image/png"
    "log"
    "net/http"
    "os"
)

// ToJpeg chuyển đổi ảnh PNG sang JPEG 
func ToJpeg(imageBytes []byte) ([]byte, error) {

    // DetectContentType phát hiện kiểu nội dung
    contentType := http.DetectContentType(imageBytes)

    switch contentType {
    case "image/png":
        // Giải mã byte ảnh PNG 
        img, err := png.Decode(bytes.NewReader(imageBytes))

        if err != nil {
            return nil, err
        }
        
        buf := new(bytes.Buffer)

        // mã hóa ảnh dưới dạng file JPEG
        if err := jpeg.Encode(buf, img, nil); err != nil {
            return nil, err
        }

        return buf.Bytes(), nil
    }

    return nil, fmt.Errorf("unable to convert %#v to jpeg", contentType)
}

Hàm ToJpeg phát hiện kiểu nội dung bằng http.DetectContentType. Hàm này lấy slice byte ảnh làm đầu vào và trả về kiểu nội dung dưới dạng chuỗi.

Câu lệnh điều kiện chuyển đổi có một trường hợp kiểm tra định dạng ảnh có phải PNG hay không. Hàm này giải mã phần byte ảnh nếu nó là một ảnh PNG chứa hàm image.Decode.

Cuối cùng, hàm ToJpeg tạo một bộ đệm mới và mã hóa ảnh ở định dạng JPEG bằng hàm jpeg.Encode.

Bạn có thể tải ảnh PNG trước khi gọi ToJpeg bằng hàm os.ReadFile:

func main() {
    // Đọc file ảnh PNG

    // Thay thế bằng đường dẫn ảnh thật cho ảnh PNG 
    imagePath := "image.png"
    imageBytes, err := os.ReadFile(imagePath)

    if err != nil {
        log.Fatalf("Failed to read image file: %s", err)
    }

    // Chuyển đổi ảnh PNG sang JPEG
    jpegBytes, err := ToJpeg(imageBytes)

    if err != nil {
        log.Fatalf("Failed to convert image: %s", err)
    }

    //---- Viết byte JPEG sang một file ----------

    // Thay thế bằng đường dẫn mong muốn cho file kết quả dạng JPEG 
    jpegPath := " output.jpg" 
    err = os.WriteFile(jpegPath, jpegBytes, os.ModePerm)

    if err != nil {
        log.Fatalf("Failed to write JPEG file: %s", err)
    }

    fmt.Println("Image conversion successful!")
}

Hàm main đọc ảnh PNG từ thư mục được chỉ định trước khi gọi hàm ToJpeg. Hàm ToJpeg trả về một phần byte của ảnh ở định dạng JPEG.

Hàm main viết file JPEG sang đường dẫn cụ thể với hàm os.WriteFile. Sau khi quá trình chuyển đổi thành công, hàm main in thông báo lên console.

Thông báo chuyển đổi ảnh thành công

Chuyển đổi ảnh từ JPEG sang PNG

JPEG là định dạng lossy được tối ưu hóa cho những bức ảnh phức tạp. JPEG có tỷ lệ nén cao hơn, cho kích thước file nhỏ hơn mặc dù chất lượng bị giảm đi một chút.

Khác PNG, JPEG không hỗ trợ độ trong suốt. Nó vượt trội trong việc hiển thị ảnh chụp với nhiều màu sắc và gradient khác nhau.

Đây là cách bạn có thể chuyển đổi file output.jpg sang file PNG tên input.png:

import (
    "bytes"
    "fmt"
    "image/jpeg"
    "image/png"
    "log"
    "os"
)

// JpegToPng chuyển đổi ảnh JPEG sang định dạng PNG 
func JpegToPng(imageBytes []byte) ([]byte, error) { 
    img, err := jpeg.Decode(bytes.NewReader(imageBytes))

    if err != nil {
        return nil, err
    }

    buf := new(bytes.Buffer)

    if err := png.Encode(buf, img); err != nil {
        return nil, err
    }

    return buf.Bytes(), nil
}

Hàm JpegToPng mã hóa phần byte ảnh bằng hàm jpeg.Decode. Hàm này tạo một bộ đệm mới để mã hóa ảnh ở định dạng PNG với hàm png.Encode.

Đây là hàm main gọi hàm JpegToPng:

func main() {
    // Đọc file ảnh JPEG

    // Thay thế bằng đường dẫn thật cho ảnh JPG
    imagePath := "output.jpg"
    imageBytes, err := os.ReadFile(imagePath)

    if err != nil {
        log.Fatalf("Failed to read image file: %s", err)
    }

    // Chuyển đổi ảnh JPEG sang PNG
    pngBytes, err := JpegToPng(imageBytes)

    if err != nil {
        log.Fatalf("Failed to convert image: %s", err)
    }

    // Viết byte PNG sang một file

    // Thay thế bằng đường dẫn ảnh mong muốn cho JPEG kết quả
    pngPath := " input.png"
    err = os.WriteFile(pngPath, pngBytes, os.ModePerm)

    if err != nil {
        log.Fatalf("Failed to write PNG file: %s", err)
    }

    fmt.Println("Image conversion successful!")
}

Hàm main đọc ảnh JPEG từ thư mục cụ thể và gọi hàm JpegToPng. Hàm này trả về một phần byte của ảnh ở định dạng PNG.

Trên đây là cách chuyển đổi định dạng ảnh PNG sang JPEG bằng Go. Hi vọng bài viết hữu ích với các bạn.

Thứ Tư, 06/09/2023 14:17
51 👨 94
0 Bình luận
Sắp xếp theo