รูปภาพเป็นหนึ่งในสิ่งแรกที่ผู้ใช้ส่วนใหญ่ให้ความสำคัญ ดังนั้นจึงเหมาะสมที่จะใช้รูปภาพที่มีรายละเอียดบนเว็บไซต์เพื่อปรับปรุงประสบการณ์ผู้ใช้ อย่างไรก็ตาม การมีรูปภาพที่ใหญ่เกินไปอาจทำให้รูปภาพติดลบในเวลาโหลดของเว็บไซต์ ส่งผลให้ประสบการณ์ใช้งานแย่ลง ดังนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องรักษาสมดุลระหว่างรายละเอียดของรูปภาพและประสิทธิภาพของเว็บไซต์

เราควรพิจารณาสามสิ่งก่อนที่จะเพิ่มประสิทธิภาพ พวกเขาคือ:

  • รูปแบบภาพ
  • ความละเอียดของภาพ
  • คุณภาพการบีบอัด

รูปแบบภาพ

รูปแบบภาพมีบทบาทสำคัญในการกำหนดวิธีการจัดเก็บ แสดง และส่งภาพ นอกจากนี้ยังกำหนดว่าการบีบอัดประเภทใดที่สามารถทำได้ และรูปภาพรองรับช่องอัลฟาหรือไม่ (ความโปร่งใส) เราจำเป็นต้องเลือกรูปแบบภาพที่เหมาะสมตามความต้องการของเรา รูปแบบรูปภาพยอดนิยมบางรูปแบบสำหรับเว็บ ได้แก่:

PNG: รูปภาพในรูปแบบ .png รองรับความโปร่งใสและใช้การบีบอัดแบบไม่สูญเสียข้อมูล กล่าวคือ ข้อมูลรูปภาพต้นฉบับจะไม่สูญหาย ดังนั้นขนาดภาพจึงค่อนข้างสูง

JPEG:ใช้การบีบอัดแบบสูญเสียซึ่งจะลดขนาดไฟล์โดยละทิ้งข้อมูลภาพบางส่วน การบีบอัดนี้อาจทำให้ไฟล์มีขนาดเล็กลงเมื่อเทียบกับรูปแบบที่ไม่มีการสูญเสียเช่น PNG แต่ไม่มีช่องอัลฟ่า

WEBP: เป็นรูปแบบไฟล์ที่ค่อนข้างใหม่และรองรับการบีบอัดทั้งแบบสูญเสียและไม่สูญเสียข้อมูล นอกจากนี้ยังสนับสนุนความโปร่งใส

ตามข้อกำหนด เราต้องเลือกรูปแบบไฟล์ที่เหมาะสม

ความละเอียดของภาพ

ความละเอียดของภาพเป็นสัดส่วนโดยตรงกับขนาดภาพ ซึ่งหมายความว่าการเพิ่มหรือลดความละเอียดจะมีผลกับขนาดภาพเช่นเดียวกัน ความละเอียดจอภาพที่ได้รับความนิยมมากที่สุดคือ 1080p และผู้ใช้ส่วนใหญ่ใช้โทรศัพท์มือถือซึ่งใช้ความละเอียดต่ำด้วยซ้ำ (ความละเอียดสัมพัทธ์) ดังนั้นการใช้ความละเอียดที่ใหญ่เกินไปถือเป็นการสิ้นเปลืองทั้งหมด เราสามารถแก้ไขได้โดยการปรับขนาดภาพให้มีความละเอียดที่เหมาะสมตามอุปกรณ์เป้าหมาย

คุณภาพการบีบอัด

คุณภาพการบีบอัดมีผลกระทบโดยตรงต่อคุณภาพของภาพ การใช้การบีบอัดสูงจะส่งผลให้สูญเสียรายละเอียด เราต้องหาสมดุลที่สมบูรณ์แบบระหว่างคุณภาพการบีบอัดและรายละเอียดในระดับที่ยอมรับได้ในภาพ

การปรับภาพให้เหมาะสมโดยใช้ไลบรารีหมอนหลาม

ก่อนที่จะเขียนโค้ด เราควรพิจารณาว่าจำเป็นต้องใช้การเพิ่มประสิทธิภาพประเภทใด

รูปแบบภาพ

ฉันใช้ .jpg เป็นรูปแบบไฟล์ที่ต้องการ เนื่องจากฉันไม่ต้องการความโปร่งใส และต่างจาก .webp ตรงที่ .jpg ได้รับการรองรับอย่างกว้างขวาง ณ ตอนนี้ ฉันสามารถใช้ .jpg ในเอกสารได้ แต่ไม่ใช่ .webp

ความละเอียดของภาพ

สำหรับความละเอียดของภาพ จำเป็นต้องมีขนาดภาพสามขนาด ขนาดหนึ่งสำหรับภาพขนาดย่อ หนึ่งขนาดสำหรับการดูเว็บปกติ และขนาดสุดท้ายจะเป็นภาพคุณภาพสูงสำหรับเนื้อหาที่สามารถซูมได้ ความละเอียดที่ฉันต้องการสำหรับแต่ละรายการคือ 160p, 900p และ 1440p

คุณภาพการบีบอัด

และสุดท้าย ฉันใช้คุณภาพการบีบอัด 80%

ค่าเหล่านี้สามารถเปลี่ยนแปลงได้ตามความต้องการ

การเข้ารหัส

สำหรับไลบรารีหมอนสคริปต์นี้ต้องได้รับการติดตั้ง

pip ติดตั้งหมอน

กำลังเปิดภาพ

from PIL import Image
original_image = Image.open(input_image)

การปรับขนาดรูปภาพ

ความละเอียดแรกจะถูกตั้งค่าเป็นค่าคงที่

THUMBNAIL_WIDTH = 160
MEDIUM_SIZE_WIDTH = 900
HIGH_SIZE_WIDTH = 1800

เมื่อปรับขนาดภาพ เราต้องรักษาอัตราส่วนภาพไว้

def resize_image(image, width):
    aspect_ratio = image.width / image.height
    height = int(width / aspect_ratio)
    return image.resize((width, height))

จากนั้นจึงปรับขนาดภาพโดยใช้

def generate_scaled_image(original_image):
    thumbnail_image = resize_image(original_image, THUMBNAIL_WIDTH)
    medium_size_image = resize_image(original_image, MEDIUM_SIZE_WIDTH)
    high_size_image = resize_image(original_image, HIGH_SIZE_WIDTH)
    return thumbnail_image, medium_size_image, high_size_image

การบีบอัดและการบันทึก

รูปภาพถูกบีบอัดและบันทึกเป็น

thumbnail_image.save(thumbnail_image_path,
                             optimize=True, quality=COMPRESSION_QUALITY)
medium_size_image.save(medium_size_image_path,
                               optimize=True, quality=COMPRESSION_QUALITY)
high_size_image.save(high_size_image_path,
                             optimize=True, quality=COMPRESSION_QUALITY)

นี่คือรหัสเต็ม

import sys
from PIL import Image
import os

# Three images will be created from this image.
# The first image will be a 128x128 thumbnail
# The second will be medium quality image
# The third will be a high quality image
THUMBNAIL_WIDTH = 168
MEDIUM_SIZE_WIDTH = 900
HIGH_SIZE_WIDTH = 1800

# Compress image to reduce size
COMPRESSION_QUALITY = 80


def resize_image(image, width):
    aspect_ratio = image.width / image.height
    height = int(width / aspect_ratio)
    return image.resize((width, height))


def generate_scaled_image(original_image):
    thumbnail_image = resize_image(original_image, THUMBNAIL_WIDTH)
    medium_size_image = resize_image(original_image, MEDIUM_SIZE_WIDTH)
    high_size_image = resize_image(original_image, HIGH_SIZE_WIDTH)
    return thumbnail_image, medium_size_image, high_size_image


def main():
    if len(sys.argv) < 3:
        print("Usage: python script.py image_name input_image storage_path")
        return

    image_name = sys.argv[1]
    input_image = sys.argv[2]
    storage_path = sys.argv[3]

    if not os.path.exists(storage_path):
        os.makedirs(storage_path + '/thumbnail')
        os.makedirs(storage_path + '/medium')
        os.makedirs(storage_path + '/high')

    try:
        original_image = Image.open(input_image)
    except Exception as e:
        print("Error opening the input image:", e)
        return

    thumbnail_image_path = os.path.join(
        storage_path, 'thumbnail', image_name + '.jpg')
    medium_size_image_path = os.path.join(
        storage_path, 'medium', image_name + '.jpg')
    high_size_image_path = os.path.join(
        storage_path, 'high', image_name + '.jpg')

    thumbnail_image, medium_size_image, high_size_image = generate_scaled_image(
        original_image)

    try:
        thumbnail_image.save(thumbnail_image_path,
                             optimize=True, quality=COMPRESSION_QUALITY)
        medium_size_image.save(medium_size_image_path,
                               optimize=True, quality=COMPRESSION_QUALITY)
        high_size_image.save(high_size_image_path,
                             optimize=True, quality=COMPRESSION_QUALITY)
        print(image_name + '.jpg', "saved successfully")
    except Exception as e:
        print("Error saving images:", e)


if __name__ == "__main__":
    main()

บทสรุป

นี่คือตัวอย่างง่ายๆ ของวิธีที่เราสามารถสร้างภาพที่ปรับให้เหมาะสมจากภาพคุณภาพสูงที่ไม่มีการบีบอัด