Skip to content

การปรับแต่งรูปภาพ

แปลงและปรับแต่งรูปภาพที่ให้บริการจาก IPFS แบบ on-the-fly โดยใช้พารามิเตอร์คิวรี นี่คือ endpoint สาธารณะที่ไม่ต้องยืนยันตัวตน

ปรับแต่งรูปภาพ

GET https://api.ipfs.ninja/image/:cid

ส่งคืนรูปภาพที่ CID ที่กำหนด แปลงตามพารามิเตอร์คิวรีที่ให้มา หากไม่มีพารามิเตอร์การแปลงใด ๆ ถูกส่งมา คำขอจะถูกเปลี่ยนเส้นทางแบบ 302 ไปยังรูปภาพต้นฉบับบน IPFS gateway

พารามิเตอร์ path

พารามิเตอร์ประเภทจำเป็นคำอธิบาย
cidstringใช่ตัวระบุเนื้อหา IPFS ของรูปภาพ

พารามิเตอร์คิวรี

พารามิเตอร์ประเภทค่าเริ่มต้นคำอธิบาย
wintegerความกว้างเอาต์พุตเป็นพิกเซล ช่วง: 1–4096 ค่าที่ ≤ 0 หรือไม่ใช่ตัวเลขจะถูกเพิกเฉย
hintegerความสูงเอาต์พุตเป็นพิกเซล ช่วง: 1–4096 ค่าที่ ≤ 0 หรือไม่ใช่ตัวเลขจะถูกเพิกเฉย
formatstringรูปแบบเอาต์พุต: webp, jpeg, png หรือ avif คำนึงถึงตัวพิมพ์ใหญ่-เล็ก (ตัวพิมพ์เล็ก) ค่าที่ไม่รู้จักจะถูกเพิกเฉย
qualityinteger80คุณภาพการบีบอัด 1–100 ใช้ได้กับ webp, jpeg และ avif เท่านั้น png เป็นแบบไม่สูญเสียข้อมูลและจะเพิกเฉยพารามิเตอร์นี้
fitstringcoverวิธีปรับรูปภาพให้พอดีกับขนาด: cover, contain, fill, inside หรือ outside

หมายเหตุ: พารามิเตอร์คือ quality ไม่ใช่ q ชื่อย่อทั่วไป (q, width, height, fmt) จะไม่ถูกรู้จัก

คำขอที่ไม่ได้ระบุ w, h หรือ format จะถือเป็นการไม่ทำอะไรและเปลี่ยนเส้นทางแบบ 302 ไปยังรูปภาพต้นฉบับ การมีเพียง quality และ fit จะไม่กระตุ้นการแปลง

โหมด fit

โหมดพฤติกรรม
coverครอปเพื่อให้ครอบคลุมทั้งสองมิติ (ค่าเริ่มต้น)
containพอดีภายในทั้งสองมิติ รักษาอัตราส่วน อาจมีพื้นที่ว่าง (โปร่งใสหรือดำขึ้นอยู่กับรูปแบบ)
fillยืดให้เต็มทั้งสองมิติ อาจบิดเบือนรูปภาพ
insideเหมือน contain แต่ลดขนาดเท่านั้น ไม่ขยาย
outsideเหมือน cover แต่ลดขนาดเท่านั้น ไม่ขยาย

การขยายขนาด

ตัวแปลงจะไม่ขยายรูปภาพเกินขนาดต้นฉบับ ถ้าคุณขอ w=2000 สำหรับต้นฉบับที่มีความกว้าง 1200px เอาต์พุตจะมีความกว้าง 1200px เรื่องนี้ใช้กับโหมด fit ทุกโหมด

การตอบกลับ

StatusWhenBody
200มีการสร้างการแปลงในคำขอนี้ไบต์รูปภาพไบนารี Content-Type ตรงกับรูปแบบที่ขอ
302ไม่มีพารามิเตอร์การแปลงใด ๆ หรือผลการแปลงก่อนหน้านี้ถูกแคชไว้แล้วเฮดเดอร์ Location ชี้ไปยังรูปภาพต้นฉบับหรือผลที่แคชไว้บน https://ipfs.ninja/image-cache/...
400ขาดพารามิเตอร์ path cid{ "error": "cid required" }
404ไม่พบ CID บน gateway{ "error": "CID not found" }
500ข้อผิดพลาดที่ไม่คาดคิด (รูปภาพเสียหาย การแปลงล้มเหลว ฯลฯ){ "error": "<message>" }

การตอบกลับ 200 และ 302 แบบแคชทั้งหมดให้บริการด้วย Cache-Control: public, max-age=31536000, immutable ดู การแคช ด้านล่าง

ตัวอย่างคำขอ

ปรับขนาดเป็นความกว้าง 400px แปลงเป็น WebP:

bash
curl "https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=400&format=webp"

ปรับขนาดและครอปเป็น 200×200 thumbnail เป็น JPEG คุณภาพ 60%:

bash
curl "https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=200&h=200&format=jpeg&quality=60&fit=cover"

thumbnail สี่เหลี่ยมจัตุรัสด้วย letterboxing แทนการครอป:

bash
curl "https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=200&h=200&format=png&fit=contain"

แปลงรูปแบบเท่านั้น ไม่ปรับขนาด (มีประโยชน์สำหรับการให้บริการ AVIF/WebP เวอร์ชันของ JPEG เก่า):

bash
curl "https://api.ipfs.ninja/image/QmXmCX9S6ANV...?format=avif&quality=70"

จำกัดความกว้างสูงสุดโดยไม่บังคับความสูง (รักษาอัตราส่วน):

bash
curl "https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=1200&format=webp"

ใช้ใน HTML

อ้างอิงรูปภาพที่ปรับแต่งแล้วโดยตรงในแท็ก img:

html
<img
  src="https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=800&format=webp&quality=75"
  alt="Optimized IPFS image"
/>

ให้บริการขนาดต่าง ๆ ด้วย srcset:

html
<img
  srcset="
    https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=400&format=webp 400w,
    https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=800&format=webp 800w,
    https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=1200&format=webp 1200w
  "
  sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px"
  src="https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=800&format=webp"
  alt="Responsive IPFS image"
/>

การเจรจารูปแบบสมัยใหม่ด้วย <picture> (AVIF → WebP → JPEG fallback):

html
<picture>
  <source
    type="image/avif"
    srcset="https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=800&format=avif&quality=60"
  />
  <source
    type="image/webp"
    srcset="https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=800&format=webp&quality=75"
  />
  <img
    src="https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=800&format=jpeg&quality=80"
    alt="IPFS image with format fallback"
  />
</picture>

CSS background-image:

css
.hero {
  background-image: url("https://api.ipfs.ninja/image/QmXmCX9S6ANV...?w=1600&format=webp&quality=70");
}

ใช้กับ Next.js

ในรูปแบบ loader ที่กำหนดเองสำหรับ next/image:

js
// loaders/ipfs.js
export default function ipfsLoader({ src, width, quality }) {
  return `https://api.ipfs.ninja/image/${src}?w=${width}&format=webp&quality=${quality || 75}`;
}
jsx
import Image from "next/image";
import ipfsLoader from "@/loaders/ipfs";

<Image
  loader={ipfsLoader}
  src="QmXmCX9S6ANV..."
  alt="IPFS image"
  width={800}
  height={600}
/>;

การแคช

การตอบกลับให้บริการด้วย Cache-Control: public, max-age=31536000, immutable เนื่องจากเนื้อหา IPFS มีการระบุที่อยู่ตามเนื้อหา CID เดียวกันกับพารามิเตอร์เดียวกันจะสร้างเอาต์พุตเดียวกันเสมอ ดังนั้นเบราว์เซอร์และ CDN จึงสามารถแคชการตอบกลับได้อย่างไม่มีกำหนด

การแปลงที่แคชไว้ถูกเก็บใน S3 โดยใช้คีย์เป็นชุดพารามิเตอร์ทั้งหมด (cid, w, h, format, quality, fit) คำขอที่ตามมาด้วยพารามิเตอร์เดียวกันจะส่งคืนการเปลี่ยนเส้นทาง 302 ไปยังแคชที่อยู่หลัง CloudFront (https://ipfs.ninja/image-cache/...) แทนที่จะเรียกใช้การแปลงซ้ำ ชุดพารามิเตอร์ที่ต่างกันจะสร้างรายการแคชที่ต่างกัน

ความพร้อมใช้งาน

การปรับแต่งรูปภาพมีให้ในทุกแผน รวมถึงแผน Dharma ฟรี