TwelveMonkeys ImageIO ให้การสนับสนุนรูปแบบไฟล์ภาพเพิ่มเติมสำหรับแพลตฟอร์ม Java ผ่านปลั๊กอินสำหรับแพ็คเกจ javax.imageio.*
เป้าหมายหลักของโปรเจ็กต์นี้คือการให้การสนับสนุนรูปแบบไฟล์ที่ไม่ครอบคลุมโดย JDK การสนับสนุนรูปแบบเหล่านี้เป็นสิ่งสำคัญเพื่อให้สามารถอ่านข้อมูลที่พบ "ในป่า" ได้ตลอดจนรักษาการเข้าถึงข้อมูลในรูปแบบเดิม เนื่องจากมีข้อมูลเดิมอยู่มากมาย เราจึงเห็นความจำเป็นในการใช้งานโปรแกรมอ่านแบบเปิดสำหรับรูปแบบยอดนิยม
ปลั๊กอิน | รูปแบบ | คำอธิบาย | ร | ว | ข้อมูลเมตา | หมายเหตุ |
---|---|---|---|---|---|---|
ผ้าบาติก | SVG | กราฟิกแบบเวกเตอร์ที่ปรับขนาดได้ | - | - | ต้องใช้ผ้าบาติก | |
WMF | MS Windows Metafile | - | - | ต้องใช้ผ้าบาติก | ||
บีเอ็มพี | บีเอ็มพี | บิตแมปอิสระของอุปกรณ์ MS Windows และ IBM OS/2 | เนทิฟ มาตรฐาน | |||
ศอ | รูปแบบเคอร์เซอร์ MS Windows | - | - | |||
ไอซีโอ | รูปแบบไอคอน MS Windows | - | ||||
ท.บ | ท.บ | รูปแบบพื้นผิวการวาดโดยตรงของ MS | - | มาตรฐาน | ||
เอชดีอาร์ | เอชดีอาร์ | รูปแบบ RGBE ช่วงไดนามิกสูงแบบ Radiance | - | มาตรฐาน | ||
ไอซีเอ็นเอส | ไอซีเอ็นเอส | รูปภาพไอคอนแอปเปิ้ล | - | |||
ไอเอฟเอฟ | ไอเอฟเอฟ | รูปแบบไฟล์ Commodore Amiga/Electronic Arts Interchange | มาตรฐาน | |||
เจเพ็ก | เจเพ็ก | กลุ่มผู้เชี่ยวชาญช่างภาพร่วม | เนทิฟ มาตรฐาน | |||
JPEG แบบไม่สูญเสีย | - | เนทิฟ มาตรฐาน | ||||
พีซีเอ็กซ์ | พีซีเอ็กซ์ | รูปแบบพู่กัน ZSoft | - | มาตรฐาน | ||
ดีซีเอ็กซ์ | เอกสารแฟกซ์ PCX หลายหน้า | - | มาตรฐาน | |||
ภาพ | ภาพ | รูปแบบรูปภาพ Apple QuickTime | มาตรฐาน | |||
พีเอ็นทีจี | รูปแบบรูปภาพ Apple MacPaint | - | มาตรฐาน | |||
พีเอ็นเอ็ม | แพม | NetPBM Portable แผนที่ใดก็ได้ | มาตรฐาน | |||
พีบีเอ็ม | แผนที่บิตแบบพกพา NetPBM | - | มาตรฐาน | |||
พีจีเอ็ม | แผนที่สีเทาแบบพกพา NetPBM | - | มาตรฐาน | |||
พีพีเอ็ม | แผนที่ Pix แบบพกพา NetPBM | มาตรฐาน | ||||
พีเอฟเอ็ม | แผนที่ลอยแบบพกพา | - | มาตรฐาน | |||
พีเอสดี | พีเอสดี | เอกสารอะโดบี โฟโต้ชอป | () | เนทิฟ มาตรฐาน | ||
พีเอสบี | Adobe Photoshop เอกสารขนาดใหญ่ | - | เนทิฟ มาตรฐาน | |||
เอสจีไอ | เอสจีไอ | รูปแบบภาพกราฟิกซิลิคอน | - | มาตรฐาน | ||
ทีจีเอ | ทีจีเอ | รูปแบบภาพ Truevision TGA | มาตรฐาน | |||
ThumbsDB | Thumbs.db | MS Windows Thumbs DB | - | - | รูปแบบตามเอกสารผสม OLE2 เท่านั้น | |
TIFF | TIFF | รูปแบบไฟล์ภาพที่แท็ก Aldus/Adobe | เนทิฟ มาตรฐาน | |||
BigTIFF | เนทิฟ มาตรฐาน | |||||
เว็บพี | เว็บพี | รูปแบบ Google WebP | - | มาตรฐาน | ||
XWD | XWD | รูปแบบการถ่ายโอนข้อมูลหน้าต่าง X11 | - | มาตรฐาน |
หมายเหตุสำคัญเกี่ยวกับการใช้ผ้าบาติก: โปรดอ่านโครงการกราฟิก Apache™ XML - ความปลอดภัย และตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชันอัปเดตและปลอดภัย
โปรดทราบว่ารูปแบบ GIF, PNG และ WBMP ได้รับการรองรับแล้วผ่าน ImageIO API โดยใช้ปลั๊กอินมาตรฐาน JDK สำหรับรูปแบบ BMP, JPEG และ TIFF ปลั๊กอิน TwelveMonkeys ให้การสนับสนุนรูปแบบเพิ่มเติมและคุณสมบัติเพิ่มเติม
ส่วนใหญ่สิ่งที่คุณต้องทำคือเพียงใส่ปลั๊กอินในโครงการของคุณแล้วเขียน:
BufferedImage image = ImageIO . read ( file );
การดำเนินการนี้จะโหลดรูปภาพแรกของไฟล์ลงในหน่วยความจำทั้งหมด
รูปแบบการเขียนพื้นฐานและง่ายที่สุดคือ:
if (! ImageIO . write ( image , format , file )) {
// Handle image not written case
}
การดำเนินการนี้จะเขียนรูปภาพทั้งหมดลงในไฟล์เดียว โดยใช้การตั้งค่าเริ่มต้นสำหรับรูปแบบที่กำหนด
ปลั๊กอินจะถูกค้นพบโดยอัตโนมัติในขณะใช้งาน ดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของกลไกนี้
หากคุณต้องการการควบคุมพารามิเตอร์การอ่านและกระบวนการอ่านเพิ่มเติม สำนวนทั่วไปในการอ่านจะเป็นดังนี้:
// Create input stream (in try-with-resource block to avoid leaks)
try ( ImageInputStream input = ImageIO . createImageInputStream ( file )) {
// Get the reader
Iterator < ImageReader > readers = ImageIO . getImageReaders ( input );
if (! readers . hasNext ()) {
throw new IllegalArgumentException ( "No reader for: " + file );
}
ImageReader reader = readers . next ();
try {
reader . setInput ( input );
// Optionally, listen for read warnings, progress, etc.
reader . addIIOReadWarningListener (...);
reader . addIIOReadProgressListener (...);
ImageReadParam param = reader . getDefaultReadParam ();
// Optionally, control read settings like sub sampling, source region or destination etc.
param . setSourceSubsampling (...);
param . setSourceRegion (...);
param . setDestination (...);
// ...
// Finally read the image, using settings from param
BufferedImage image = reader . read ( 0 , param );
// Optionally, read thumbnails, meta data, etc...
int numThumbs = reader . getNumThumbnails ( 0 );
// ...
}
finally {
// Dispose reader in finally block to avoid memory leaks
reader . dispose ();
}
}
ค้นหาขนาดรูปภาพต้นฉบับจากโปรแกรมอ่านโดยใช้ reader.getWidth(n)
และ reader.getHeight(n)
โดยไม่ต้องอ่านรูปภาพทั้งหมดลงในหน่วยความจำก่อน
คุณยังสามารถอ่านรูปภาพหลายรูปจากไฟล์เดียวกันในลูปได้โดยใช้ reader.getNumImages()
หากคุณต้องการควบคุมพารามิเตอร์การเขียนและขั้นตอนการเขียนให้มากขึ้น สำนวนทั่วไปในการเขียนจะเป็นดังนี้:
// Get the writer
Iterator < ImageWriter > writers = ImageIO . getImageWritersByFormatName ( format );
if (! writers . hasNext ()) {
throw new IllegalArgumentException ( "No writer for: " + format );
}
ImageWriter writer = writers . next ();
try {
// Create output stream (in try-with-resource block to avoid leaks)
try ( ImageOutputStream output = ImageIO . createImageOutputStream ( file )) {
writer . setOutput ( output );
// Optionally, listen to progress, warnings, etc.
ImageWriteParam param = writer . getDefaultWriteParam ();
// Optionally, control format specific settings of param (requires casting), or
// control generic write settings like sub sampling, source region, output type etc.
// Optionally, provide thumbnails and image/stream metadata
writer . write (..., new IIOImage (..., image , ...), param );
}
}
finally {
// Dispose writer in finally block to avoid memory leaks
writer . dispose ();
}
สำหรับการใช้งานขั้นสูงเพิ่มเติม และข้อมูลเกี่ยวกับวิธีการใช้ ImageIO API ฉันขอแนะนำให้คุณอ่านคู่มือ Java Image I/O API จาก Oracle
import com . twelvemonkeys . imageio . path . Paths ;
...
try ( ImageInputStream stream = ImageIO . createImageInputStream ( new File ( "image_with_path.jpg" )) {
BufferedImage image = Paths . readClipped ( stream );
// Do something with the clipped image...
}
ดูการสนับสนุน Adobe Clipping Path บน Wiki สำหรับรายละเอียดเพิ่มเติมและโค้ดตัวอย่าง
ไลบรารีมาพร้อมกับการดำเนินการสุ่มตัวอย่างใหม่ (การปรับขนาดรูปภาพ) ซึ่งมีอัลกอริธึมที่แตกต่างกันมากมายเพื่อให้ได้ผลลัพธ์ที่ยอดเยี่ยมด้วยความเร็วที่เหมาะสม
import com . twelvemonkeys . image . ResampleOp ;
...
BufferedImage input = ...; // Image to resample
int width , height = ...; // new width/height
BufferedImageOp resampler = new ResampleOp ( width , height , ResampleOp . FILTER_LANCZOS ); // A good default filter, see class documentation for more info
BufferedImage output = resampler . filter ( input , null );
ไลบรารีมาพร้อมกับการดำเนินการ dithering ซึ่งสามารถใช้ในการแปลง BufferedImage
s เป็น IndexColorModel
โดยใช้ Floyd-Steinberg error-diffusion dither
import com . twelvemonkeys . image . DiffusionDither ;
...
BufferedImage input = ...; // Image to dither
BufferedImageOp ditherer = new DiffusionDither ();
BufferedImage output = ditherer . filter ( input , null );
เมื่อใช้รูปแบบปกติในการโหลดรูปภาพ การพยายามโหลดรูปภาพที่เสียหายจะส่งผลให้ IOException
ถูกส่งออกไป
BufferedImage image = null ;
try {
image = ImageIO . read ( file );
} catch ( IOException exception ) {
// Handle, log a warning/error etc
}
ในสถานการณ์สมมตินี้ ถ้ารูปภาพเสียหาย และ ImageIO.read
ส่งข้อยกเว้น image
ยังคง null
- เป็นไปไม่ได้ที่ฟังก์ชันจะส่งคืนค่าและส่งข้อยกเว้น
อย่างไรก็ตาม ในบางกรณี อาจเป็นไปได้ที่จะได้รับข้อมูลภาพที่ใช้งานได้จากภาพที่เสียหาย วิธีการทำเช่นนี้คือใช้ ImageReadParam
เพื่อตั้งค่า BufferedImage
เป็นปลายทาง
int width = reader . getWidth ( 0 );
int height = reader . getHeight ( 0 );
ImageTypeSpecifier imageType = reader . getRawImageType ( 0 );
BufferedImage image = imageType . createBufferedImage ( width , height );
ImageReadParam param = reader . getDefaultReadParam ();
param . setDestination ( image );
try {
reader . read ( 0 , param );
}
catch ( IOException e ) {
// Handle, log a warning/error etc
}
ตามทฤษฎีแล้วสิ่งนี้ควรจะใช้ได้กับปลั๊กอินทั้งหมด แต่ผลลัพธ์ที่ได้คือปลั๊กอิน/การใช้งานที่เฉพาะเจาะจงอย่างมาก ด้วยรูปแบบบางรูปแบบและไฟล์ที่เสียหายบางรูปแบบ คุณอาจได้ภาพที่มีประโยชน์เป็นส่วนใหญ่ อย่างไรก็ตาม คุณควรเตรียมพร้อมสำหรับความเป็นไปได้ที่จะให้ภาพว่างเปล่าหรือว่างเปล่า
ดาวน์โหลดโครงการ (โดยใช้ Git):
$ git clone [email protected]:haraldk/TwelveMonkeys.git
สิ่งนี้ควรสร้างโฟลเดอร์ชื่อ TwelveMonkeys
ในไดเร็กทอรีปัจจุบันของคุณ เปลี่ยนไดเร็กทอรีเป็นโฟลเดอร์ TwelveMonkeys
และออกคำสั่งด้านล่างเพื่อสร้าง
สร้างโครงการ (โดยใช้ Maven):
$ mvn package
ปัจจุบัน JDK ที่แนะนำสำหรับการสร้างบิลด์คือ Oracle JDK 8.x
เป็นไปได้ที่จะสร้างโดยใช้ OpenJDK แต่การทดสอบบางอย่างอาจล้มเหลวเนื่องจากความแตกต่างเล็กน้อยระหว่างระบบการจัดการสีที่ใช้ คุณจะต้องปิดการใช้งานการทดสอบที่เป็นปัญหา หรือสร้างโดยไม่มีการทดสอบเลย
เนื่องจากการทดสอบหน่วยต้องใช้หน่วยความจำค่อนข้างน้อยในการทำงาน คุณอาจต้องตั้งค่าตัวแปรสภาพแวดล้อม MAVEN_OPTS
เพื่อให้กระบวนการ Java ที่รัน Maven มีหน่วยความจำเพิ่มขึ้น ฉันขอแนะนำบางอย่างเช่น -Xmx512m -XX:MaxPermSize=256m
คุณสามารถเลือกติดตั้งโปรเจ็กต์ในพื้นที่เก็บข้อมูล Maven ในเครื่องของคุณได้โดยใช้:
$ mvn install
หากต้องการติดตั้งปลั๊กอิน ให้ใช้ Maven และเพิ่มการขึ้นต่อกันที่จำเป็นให้กับโปรเจ็กต์ของคุณ หรือเพิ่ม JAR ที่จำเป็นด้วยตนเองพร้อมกับการขึ้นต่อกันที่จำเป็นในคลาสพาธ
กลไกการค้นหารีจิสทรีและการบริการ ImageIO จะทำให้แน่ใจว่าปลั๊กอินพร้อมใช้งาน
เพื่อตรวจสอบว่าปลั๊กอิน JPEG ได้รับการติดตั้งและใช้งานในขณะรันไทม์ คุณสามารถใช้โค้ดต่อไปนี้:
Iterator < ImageReader > readers = ImageIO . getImageReadersByFormatName ( "JPEG" );
while ( readers . hasNext ()) {
System . out . println ( "reader: " + readers . next ());
}
บรรทัดแรกควรพิมพ์:
reader: com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReader@somehash
หากต้องการขึ้นอยู่กับปลั๊กอิน JPEG และ TIFF โดยใช้ Maven ให้เพิ่มสิ่งต่อไปนี้ใน POM ของคุณ:
...
< dependencies >
...
< dependency >
< groupId >com.twelvemonkeys.imageio</ groupId >
< artifactId >imageio-jpeg</ artifactId >
< version >3.12.0</ version >
</ dependency >
< dependency >
< groupId >com.twelvemonkeys.imageio</ groupId >
< artifactId >imageio-tiff</ artifactId >
< version >3.12.0</ version >
</ dependency >
<!--
Optional dependency. Needed only if you deploy ImageIO plugins as part of a web app.
Make sure you add the IIOProviderContextListener to your web.xml, see above.
-->
< dependency >
< groupId >com.twelvemonkeys.servlet</ groupId >
< artifactId >servlet</ artifactId >
< version >3.12.0</ version >
</ dependency >
<!--
Or Jakarta version, for Servlet API 5.0
-->
< dependency >
< groupId >com.twelvemonkeys.servlet</ groupId >
< artifactId >servlet</ artifactId >
< version >3.12.0</ version >
< classifier >jakarta</ classifier >
</ dependency >
</ dependencies >
หากต้องการใช้ปลั๊กอิน JPEG และ TIFF ใน IDE หรือโปรแกรมของคุณ ให้เพิ่ม JAR ต่อไปนี้ทั้งหมดลงในเส้นทางคลาสของคุณ:
twelvemonkeys-common-lang-3.12.0.jar
twelvemonkeys-common-io-3.12.0.jar
twelvemonkeys-common-image-3.12.0.jar
twelvemonkeys-imageio-core-3.12.0.jar
twelvemonkeys-imageio-metadata-3.12.0.jar
twelvemonkeys-imageio-jpeg-3.12.0.jar
twelvemonkeys-imageio-tiff-3.12.0.jar
เนื่องจากรีจิสทรีปลั๊กอิน ImageIO
( IIORegistry
) คือ "VM global" จึงทำงานได้ไม่ดีกับบริบทเซิร์ฟเล็ตตามที่เป็นอยู่ โดยเฉพาะอย่างยิ่งหากคุณโหลดปลั๊กอินจาก WEB-INF/lib
หรือโฟลเดอร์ classes
ปลั๊กอินอาจไม่พร้อมใช้งานเลย ยกเว้นในกรณีที่คุณเพิ่ม ImageIO.scanForPlugins()
ในโค้ดของคุณ
นอกจากนี้ บริบทเซิร์ฟเล็ตยังโหลดและยกเลิกการโหลดคลาสแบบไดนามิก (โดยใช้ตัวโหลดคลาสใหม่ตามบริบท) หากคุณรีสตาร์ทแอปพลิเคชัน คลาสเก่าจะยังคงอยู่ในหน่วยความจำตามค่าเริ่มต้นตลอดไป (เนื่องจากครั้งต่อไปที่ scanForPlugins
ถูกเรียก จะเป็น ClassLoader
อีกตัวที่สแกน/โหลดคลาส และจะเป็นอินสแตนซ์ใหม่ในรีจิสทรี) หากมีการพยายามอ่านโดยใช้ตัวอ่าน "เก่า" ตัวใดตัวหนึ่งที่เหลืออยู่ ข้อยกเว้นแปลก ๆ (เช่น NullPointerException
s เมื่อเข้าถึงฟิลด์เตรียมใช้งานขั้น static final
หรือ NoClassDefFoundError
s สำหรับคลาสภายในที่ไม่ได้เตรียมใช้งาน) อาจเกิดขึ้นได้
เพื่อหลีกเลี่ยงปัญหาการค้นพบและการรั่วไหลของทรัพยากร ขอแนะนำอย่างยิ่ง ให้ใช้ IIOProviderContextListener
ที่ใช้การโหลดและยกเลิกการโหลดปลั๊กอิน ImageIO แบบไดนามิกสำหรับเว็บแอปพลิเคชัน
< web-app ...>
...
< listener >
< display-name >ImageIO service provider loader/unloader</ display-name >
< listener-class >com.twelvemonkeys.servlet.image.IIOProviderContextListener</ listener-class >
</ listener >
...
</ web-app >
ไม่รองรับการโหลดปลั๊กอินจาก WEB-INF/lib
โดยไม่ติดตั้งตัวฟังบริบท และจะทำงานไม่ถูกต้อง
ตัวฟังบริบทไม่มีการพึ่งพาปลั๊กอิน TwelveMonkeys ImageIO และอาจใช้กับ JAI ImageIO หรือปลั๊กอิน ImageIO อื่น ๆ ได้เช่นกัน
อีกทางเลือกหนึ่งที่ปลอดภัยคือการวางไฟล์ JAR ไว้ในโฟลเดอร์ lib ที่ใช้ร่วมกันหรือทั่วไปของแอปพลิเคชันเซิร์ฟเวอร์
สำหรับผู้ที่เปลี่ยนจาก javax.servlet
เก่าไปเป็นแพ็คเกจ jakarta.servlet
ใหม่ จะมีการขึ้นต่อกันที่แยกต่างหาก ประกอบด้วยคลาสเซิร์ฟเล็ตเดียวกันกับที่กล่าวไว้ข้างต้น แต่สร้างขึ้นจากแพ็คเกจ Jakarta EE ใหม่ การขึ้นต่อกันมีชื่อกลุ่มและตัวระบุเหมือนเดิม แต่มีตัว แยกประเภท jakarta
ต่อท้าย เพื่อแยกความแตกต่างจากแพ็คเกจที่ไม่ใช่จาการ์ตา
ดูตัวอย่างการขึ้นต่อกันของ Maven สำหรับวิธีเปิดใช้งานด้วย Maven Gradle หรือเครื่องมือสร้างอื่นๆ จะมีตัวเลือกที่คล้ายกัน
วิธีที่แนะนำในการใช้ปลั๊กอินคือเพียงรวม JAR ตามที่เป็นอยู่ในโปรเจ็กต์ของคุณ ผ่านการพึ่งพา Maven หรือที่คล้ายกัน ไม่จำเป็นต้องบรรจุซ้ำเพื่อใช้ห้องสมุด และไม่แนะนำ
อย่างไรก็ตาม หากคุณต้องการสร้าง JAR ที่ "อ้วน" หรือต้องการรวมแพ็คเกจ JAR ใหม่ด้วยเหตุผลบางประการ สิ่งสำคัญคือต้องจำไว้ว่าการค้นหาปลั๊กอินโดยอัตโนมัติโดย ImageIO ขึ้นอยู่กับกลไก Service Provider Interface (SPI) กล่าวโดยย่อ แต่ละ JAR มีโฟลเดอร์พิเศษชื่อ META-INF/services
ที่มีไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไป โดยทั่วไปคือ javax.imageio.spi.ImageReaderSpi
และ javax.imageio.spi.ImageWriterSpi
ไฟล์เหล่านี้มี ชื่อเดียวกันในทุก JAR ดังนั้นหากคุณเพียงแค่แยกทุกอย่างลงในโฟลเดอร์เดียวหรือสร้าง JAR ไฟล์จะถูกเขียนทับและลักษณะการทำงานจะไม่ถูกระบุ (ส่วนใหญ่มีแนวโน้มว่าคุณจะต้องติดตั้งปลั๊กอินตัวเดียว)
วิธีแก้ไขคือต้องแน่ใจว่าไฟล์ทั้งหมดที่มีชื่อเดียวกันถูกรวมเป็นไฟล์เดียว ซึ่งมีข้อมูล SPI ทั้งหมดของแต่ละประเภท หากใช้ปลั๊กอิน Maven Shade คุณควรใช้ ServicesResourceTransformer เพื่อรวมไฟล์เหล่านี้อย่างเหมาะสม คุณอาจต้องการใช้ ManifestResourceTransforme เพื่อรับชื่อผู้จำหน่าย ข้อมูลเวอร์ชัน ฯลฯ ที่ถูกต้อง ชุดบันเดิล JAR "อ้วน" อื่นๆ อาจมีกลไกที่คล้ายกันในการรวมรายการที่มีชื่อเดียวกัน
เวอร์ชันล่าสุดที่จะทำงานบน Java 7 คือ 3.9.4 เวอร์ชันที่ใหม่กว่าจะต้องใช้ Java 8 หรือใหม่กว่า
การพึ่งพาทั่วไป
การพึ่งพา ImageIO
ปลั๊กอิน ImageIO
ปลั๊กอิน ImageIO ที่ต้องการ libs ของบุคคลที่สาม
รองรับ Photoshop Path สำหรับ ImageIO
รองรับเซิร์ฟเล็ต
โครงการนี้จัดทำขึ้นภายใต้ใบอนุญาต BSD ที่ได้รับอนุมัติจาก OSI:
Copyright (c) 2008-2022, Harald Kuhr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
o Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
o Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
o Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ถาม: ฉันจะใช้มันได้อย่างไร?
ตอบ: วิธีที่ง่ายที่สุดคือการสร้างโปรเจ็กต์ของคุณเองโดยใช้ Maven, Gradle หรือเครื่องมือสร้างอื่นๆ ที่มีการจัดการการขึ้นต่อกัน และเพียงเพิ่มการขึ้นต่อกันให้กับปลั๊กอินเฉพาะที่คุณต้องการ หากคุณไม่ได้ใช้เครื่องมือ build ดังกล่าว ตรวจสอบให้แน่ใจว่าคุณมี JAR ที่จำเป็นทั้งหมดใน classpath ดูส่วนการติดตั้งด้านบน
ถาม: ฉันต้องทำการเปลี่ยนแปลงอะไรบ้างกับโค้ดของฉันจึงจะสามารถใช้ปลั๊กอินได้
ตอบ: คำตอบสั้นๆ คือ: ไม่มี สำหรับการใช้งานพื้นฐาน เช่น ImageIO.read(...)
หรือ ImageIO.getImageReaders(...)
คุณไม่จำเป็นต้องเปลี่ยนโค้ดของคุณ ฟังก์ชันการทำงานส่วนใหญ่พร้อมใช้งานผ่าน ImageIO API มาตรฐาน และมีการใช้ความระมัดระวังเป็นอย่างยิ่งที่จะไม่แนะนำ API พิเศษเพิ่มเติมโดยไม่จำเป็น
หากคุณต้องการใช้คุณสมบัติเฉพาะ/ขั้นสูงของบางรูปแบบ คุณอาจต้องใช้ API เฉพาะ เช่น การตั้งค่า URL พื้นฐานสำหรับรูปภาพ SVG ที่ประกอบด้วยหลายไฟล์ หรือควบคุมการบีบอัดเอาต์พุตของไฟล์ TIFF
ถาม: มันทำงานอย่างไร?
ตอบ: โปรเจ็กต์ TwelveMonkeys ImageIO มีปลั๊กอินสำหรับ ImageIO ImageIO ใช้กลไกการค้นหาบริการเพื่อค้นหาปลั๊กอินในขณะรันไทม์
สิ่งที่คุณต้องทำคือต้องแน่ใจว่าคุณมี TwelveMonkeys ImageIO JARs ใน classpath ของคุณ
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับรีจิสทรีและกลไกการค้นหาได้ในเอกสาร IIORegistry API
การพิมพ์แบบละเอียด: ผู้ให้บริการ TwelveMonkeys สำหรับ JPEG, BMP และ TIFF แทนที่วิธี onRegistration และใช้กลไกการเรียงลำดับบางส่วนแบบคู่ของ IIOServiceRegistry
เพื่อให้แน่ใจว่าได้รับการติดตั้งก่อนที่ Sun/Oracle จะจัดเตรียม JPEGImageReader
, BMPImageReader
TIFFImageReader
และ Apple ให้ TIFFImageReader
บน OS X ตามลำดับ การใช้การเรียงลำดับแบบคู่จะไม่ลบฟังก์ชันการทำงานใดๆ ที่เกิดขึ้นจากการใช้งานเหล่านี้ แต่โดยส่วนใหญ่ คุณจะต้องใช้ปลั๊กอิน TwelveMonkeys แทน
ถาม: เหตุใดจึงไม่รองรับรูปแบบทั่วไปเช่น GIF หรือ PNG
ตอบ: คำตอบสั้นๆ ก็คือการสนับสนุน ImageIO ในตัวสำหรับรูปแบบเหล่านี้ถือว่าดีเพียงพอแล้ว หากคุณกำลังมองหาประสิทธิภาพการเขียน PNG ที่ดีขึ้นบน Java 7 และ 8 โปรดดู JDK9 PNG Writer Backport
ถาม: จะเปิดตัวครั้งต่อไปเมื่อใด? กำหนดการเปิดตัวปัจจุบันคืออะไร?
ตอบ: เป้าหมายคือการเปิดตัวทุกเดือน โดยมีการแก้ไขข้อบกพร่องและคุณสมบัติใหม่เล็กน้อย และการเปิดตัวรายไตรมาสพร้อมฟีเจอร์ "หลัก" เพิ่มเติม
ถาม: ฉันชอบโปรเจ็กต์นี้! ฉันจะช่วยได้อย่างไร?
ตอบ: ดูปัญหาที่เปิดอยู่ และดูว่ามีปัญหาใดๆ ที่คุณสามารถช่วยแก้ไข หรือจัดเตรียมไฟล์ตัวอย่างหรือสร้างกรณีทดสอบได้หรือไม่ เป็นไปได้สำหรับคุณหรือองค์กรของคุณที่จะเป็นผู้สนับสนุนผ่านผู้สนับสนุน GitHub การจัดหาเงินทุนจะช่วยให้เราใช้เวลามากขึ้นในการแก้ไขข้อบกพร่องและการนำคุณสมบัติใหม่ๆ ไปใช้
ถาม: แล้วเจเอไอล่ะ? JAI รองรับหลายรูปแบบแล้ว
ตอบ: แม้ว่า JAI (และโดยเฉพาะ jai-imageio) จะรองรับรูปแบบเดียวกันบางรูปแบบ แต่ JAI ก็มีปัญหาสำคัญบางประการ ที่ชัดเจนที่สุดก็คือ:
ถาม: แล้ว JMagick หรือ IM4Java ล่ะ คุณใช้สิ่งที่มีอยู่แล้วไม่ได้เหรอ?
ตอบ: แม้ว่าไลบรารีที่ยอดเยี่ยมซึ่งมีรูปแบบที่หลากหลายจะรองรับ แต่ไลบรารีที่ใช้ ImageMagick ก็มีข้อเสียอยู่บ้างเมื่อเทียบกับ ImageIO
เราทำได้แล้ว