Metadata API
Sharp ให้ฟังก์ชันการทำงานที่หลากหลายสำหรับการจัดการข้อมูลเมตา สามารถอ่าน แก้ไข และเขียนข้อมูลเมตาของรูปภาพได้
การอ่านข้อมูลเมตา
การใช้งานพื้นฐาน
javascript
import sharp from 'sharp';
// อ่านข้อมูลเมตาของรูปภาพ
const metadata = await sharp('input.jpg').metadata();
console.log(metadata);โครงสร้างวัตถุข้อมูลเมตา
javascript
{
format: 'jpeg', // รูปแบบรูปภาพ
width: 1920, // ความกว้าง
height: 1080, // ความสูง
space: 'srgb', // พื้นที่สี
channels: 3, // จำนวนช่องสัญญาณ
depth: 'uchar', // ความลึกของบิต
density: 72, // ความละเอียด
hasProfile: false, // มีโปรไฟล์สีหรือไม่
hasAlpha: false, // มีช่องสัญญาณความโปร่งใสหรือไม่
isOpaque: true, // ไม่โปร่งใสหรือไม่
orientation: 1, // ทิศทาง EXIF
exif: { ... }, // ข้อมูล EXIF
icc: { ... }, // โปรไฟล์ ICC
iptc: { ... }, // ข้อมูล IPTC
xmp: { ... }, // ข้อมูล XMP
tifftagPhotoshop: { ... } // แท็ก TIFF ของ Photoshop
}ข้อมูล EXIF
การอ่าน EXIF
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.exif) {
console.log('ข้อมูล EXIF:', metadata.exif);
// แยกวิเคราะห์ข้อมูล EXIF
const exif = sharp.exif(metadata.exif);
console.log('เวลาถ่ายภาพ:', exif.DateTime);
console.log('รุ่นกล้อง:', exif.Model);
console.log('ISO:', exif.ISOSpeedRatings);
}การเขียน EXIF
javascript
// สร้างข้อมูล EXIF
const exif = sharp.exif({
IFD0: {
ImageDescription: 'รูปภาพที่ประมวลผลด้วย Sharp',
Copyright: '© 2024'
},
IFD1: {
Orientation: 1
},
EXIF: {
DateTimeOriginal: new Date().toISOString(),
UserComment: 'ประมวลผลด้วย Sharp'
}
});
// เขียนข้อมูล EXIF
await sharp('input.jpg')
.withMetadata({ exif })
.jpeg()
.toFile('output.jpg');โปรไฟล์สี ICC
การอ่านโปรไฟล์ ICC
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.icc) {
console.log('โปรไฟล์ ICC:', metadata.icc);
}การฝังโปรไฟล์ ICC
javascript
// ฝังโปรไฟล์ sRGB
await sharp('input.jpg')
.withMetadata({ icc: 'srgb' })
.jpeg()
.toFile('output.jpg');
// ฝังโปรไฟล์ ICC ที่กำหนดเอง
const iccProfile = fs.readFileSync('custom.icc');
await sharp('input.jpg')
.withMetadata({ icc: iccProfile })
.jpeg()
.toFile('output.jpg');ข้อมูล IPTC
การอ่าน IPTC
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.iptc) {
console.log('ข้อมูล IPTC:', metadata.iptc);
}การเขียน IPTC
javascript
const iptc = {
'2:05': 'Object Name',
'2:15': 'Category',
'2:25': 'Keywords',
'2:55': 'Date Created',
'2:80': 'By-line',
'2:116': 'Copyright'
};
await sharp('input.jpg')
.withMetadata({ iptc })
.jpeg()
.toFile('output.jpg');ข้อมูล XMP
การอ่าน XMP
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.xmp) {
console.log('ข้อมูล XMP:', metadata.xmp);
}การเขียน XMP
javascript
const xmp = `
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>รูปภาพที่ประมวลผลด้วย Sharp</dc:title>
<dc:creator>Sharp</dc:creator>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
`;
await sharp('input.jpg')
.withMetadata({ xmp })
.jpeg()
.toFile('output.jpg');ข้อมูลทิศทาง
การอ่านทิศทาง
javascript
const metadata = await sharp('input.jpg').metadata();
console.log('ทิศทางรูปภาพ:', metadata.orientation);การหมุนอัตโนมัติ
javascript
// หมุนอัตโนมัติตามทิศทาง EXIF
await sharp('input.jpg')
.rotate() // หมุนอัตโนมัติ
.jpeg()
.toFile('output.jpg');ข้อมูลความละเอียด
การอ่านความละเอียด
javascript
const metadata = await sharp('input.jpg').metadata();
console.log('ความละเอียด:', metadata.density);การตั้งค่าความละเอียด
javascript
await sharp('input.jpg')
.withMetadata({ density: 300 })
.jpeg()
.toFile('output.jpg');การเก็บรักษาข้อมูลเมตา
การเก็บรักษาข้อมูลเมตาทั้งหมด
javascript
// เก็บรักษาข้อมูลเมตาที่มีอยู่ทั้งหมด
await sharp('input.jpg')
.resize(800, 600)
.withMetadata()
.jpeg()
.toFile('output.jpg');การเลือกเก็บรักษา
javascript
// เก็บรักษาเฉพาะข้อมูล EXIF
await sharp('input.jpg')
.resize(800, 600)
.withMetadata({ exif: true })
.jpeg()
.toFile('output.jpg');
// เก็บรักษา EXIF และ ICC
await sharp('input.jpg')
.resize(800, 600)
.withMetadata({ exif: true, icc: true })
.jpeg()
.toFile('output.jpg');การลบข้อมูลเมตา
การลบข้อมูลเมตาทั้งหมด
javascript
// ลบข้อมูลเมตาทั้งหมด
await sharp('input.jpg')
.resize(800, 600)
.jpeg()
.toFile('output.jpg');การลบข้อมูลเมตาเฉพาะ
javascript
// ลบ EXIF แต่เก็บรักษาส่วนอื่น
await sharp('input.jpg')
.resize(800, 600)
.withMetadata({ exif: false })
.jpeg()
.toFile('output.jpg');การประมวลผลข้อมูลเมตาแบบกลุ่ม
การอ่านแบบกลุ่ม
javascript
const fs = require('fs').promises;
async function batchReadMetadata(directory) {
const files = await fs.readdir(directory);
const results = [];
for (const file of files) {
if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
try {
const metadata = await sharp(`${directory}/${file}`).metadata();
results.push({ file, metadata });
} catch (error) {
console.error(`การอ่านข้อมูลเมตาของ ${file} ล้มเหลว:`, error.message);
}
}
}
return results;
}การเขียนแบบกลุ่ม
javascript
async function batchWriteMetadata(directory, metadata) {
const files = await fs.readdir(directory);
for (const file of files) {
if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
try {
await sharp(`${directory}/${file}`)
.withMetadata(metadata)
.toFile(`${directory}/processed_${file}`);
} catch (error) {
console.error(`การประมวลผล ${file} ล้มเหลว:`, error.message);
}
}
}
}การตรวจสอบข้อมูลเมตา
การตรวจสอบความสมบูรณ์ของข้อมูลเมตา
javascript
async function validateMetadata(filePath) {
try {
const metadata = await sharp(filePath).metadata();
// ตรวจสอบคุณสมบัติพื้นฐาน
if (!metadata.width || !metadata.height) {
throw new Error('ขาดข้อมูลขนาด');
}
// ตรวจสอบรูปแบบ
if (!metadata.format) {
throw new Error('ขาดข้อมูลรูปแบบ');
}
// ตรวจสอบจำนวนช่องสัญญาณ
if (!metadata.channels) {
throw new Error('ขาดข้อมูลช่องสัญญาณ');
}
return {
valid: true,
metadata
};
} catch (error) {
return {
valid: false,
error: error.message
};
}
}การเพิ่มประสิทธิภาพ
การอ่านเฉพาะข้อมูลเมตาที่ต้องการ
javascript
// อ่านเฉพาะข้อมูลพื้นฐาน ไม่แยกวิเคราะห์ EXIF
const metadata = await sharp('input.jpg')
.metadata({ pages: -1 });
// อ่านเฉพาะ EXIF
const metadata = await sharp('input.jpg')
.metadata({ exif: true });การประมวลผลแบบสตรีม
javascript
const fs = require('fs');
// อ่านข้อมูลเมตาแบบสตรีม
const stream = fs.createReadStream('input.jpg');
const metadata = await sharp(stream).metadata();การจัดการข้อผิดพลาด
javascript
try {
const metadata = await sharp('input.jpg').metadata();
console.log('ข้อมูลเมตา:', metadata);
} catch (error) {
if (error.code === 'VipsForeignLoad') {
console.error('รูปแบบรูปภาพไม่รองรับ');
} else if (error.code === 'VipsForeignLoadLimit') {
console.error('รูปภาพใหญ่เกินไป');
} else {
console.error('การอ่านข้อมูลเมตาล้มเหลว:', error.message);
}
}