يوفر TwelveMonkeys ImageIO دعمًا موسعًا لتنسيق ملفات الصور لمنصة Java، من خلال المكونات الإضافية لحزمة javax.imageio.*
.
الهدف الرئيسي من هذا المشروع هو تقديم الدعم لتنسيقات الملفات التي لا يغطيها JDK. يعد دعم هذه التنسيقات أمرًا مهمًا، لتتمكن من قراءة البيانات الموجودة "في البرية"، وكذلك للحفاظ على الوصول إلى البيانات في التنسيقات القديمة. نظرًا لوجود الكثير من البيانات القديمة، فإننا نرى الحاجة إلى تطبيقات مفتوحة للقراء للتنسيقات الشائعة.
البرنامج المساعد | شكل | وصف | ر | دبليو | البيانات الوصفية | ملحوظات |
---|---|---|---|---|---|---|
الباتيك | SVG | رسومات المتجهات قابلة للتطوير | ✔ | - | - | يتطلب الباتيك |
ومف | ملف تعريف مايكروسوفت ويندوز | ✔ | - | - | يتطلب الباتيك | |
بي إم بي | بي إم بي | MS Windows وIBM OS/2 صورة نقطية مستقلة عن الأجهزة | ✔ | ✔ | أصلي، قياسي | |
كور | تنسيق المؤشر لـ MS Windows | ✔ | - | - | ||
عرض أولي للعملة | تنسيق أيقونة مايكروسوفت ويندوز | ✔ | ✔ | - | ||
دس | دس | تنسيق سطح الرسم المباشر MS | ✔ | - | معيار | |
تقرير التنمية البشرية | تقرير التنمية البشرية | إشعاع النطاق الديناميكي العالي تنسيق RGBE | ✔ | - | معيار | |
ICNS | ICNS | صورة أيقونة أبل | ✔ | ✔ | - | |
إيف | إيف | كومودور أميغا/تنسيق ملف تبادل الفنون الإلكترونية | ✔ | ✔ | معيار | |
جبيغ | جبيغ | مجموعة خبراء المصورين المشتركة | ✔ | ✔ | أصلي، قياسي | |
JPEG ضياع | ✔ | - | أصلي، قياسي | |||
PCX | PCX | تنسيق فرشاة الرسم ZSoft | ✔ | - | معيار | |
دي سي اكس | مستند فاكس PCX متعدد الصفحات | ✔ | - | معيار | ||
بيكت | بيكت | تنسيق صورة أبل كويك تايم | ✔ | ✔ | معيار | |
بي إن تي جي | تنسيق صورة أبل ماكبينت | ✔ | - | معيار | ||
الحركة الوطنية الفلبينية | بام | NetPBM المحمولة أي خريطة | ✔ | ✔ | معيار | |
بي بي إم | خريطة بت المحمولة NetPBM | ✔ | - | معيار | ||
PGM | خريطة NetPBM المحمولة باللون الرمادي | ✔ | - | معيار | ||
جزء في المليون | خريطة بيكس المحمولة NetPBM | ✔ | ✔ | معيار | ||
المالية العامة | خريطة تعويم المحمولة | ✔ | - | معيار | ||
PSD | PSD | وثيقة أدوبي فوتوشوب | ✔ | (✔) | أصلي، قياسي | |
PSB | أدوبي فوتوشوب وثيقة كبيرة | ✔ | - | أصلي، قياسي | ||
SGI | SGI | تنسيق صورة رسومات السيليكون | ✔ | - | معيار | |
TGA | TGA | تنسيق صورة Truevision TGA | ✔ | ✔ | معيار | |
ThumbsDB | Thumbs.db | مايكروسوفت ويندوز ممتاز DB | ✔ | - | - | تنسيق المستند إلى المستند المركب OLE2 فقط |
شجار | شجار | ألدوس/أدوبي تنسيق ملف الصورة الموسومة | ✔ | ✔ | أصلي، قياسي | |
BigTIFF | ✔ | ✔ | أصلي، قياسي | |||
ويب بي | ويب بي | تنسيق ويب جوجل | ✔ | - | معيار | |
XWD | XWD | تنسيق تفريغ النافذة X11 | ✔ | - | معيار |
ملاحظة مهمة حول استخدام Batik: يرجى قراءة مشروع رسومات Apache™ XML - الأمان، وتأكد من استخدام إصدار محدث وآمن.
لاحظ أن تنسيقات GIF وPNG وWBMP مدعومة بالفعل من خلال واجهة برمجة تطبيقات ImageIO، باستخدام المكونات الإضافية القياسية لـ 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 );
تأتي المكتبة مع عملية ثبات الألوان، التي يمكن استخدامها لتحويل BufferedImage
s إلى IndexColorModel
باستخدام ثبات نشر الأخطاء Floyd-Steinberg.
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 عام"، فإنه لا يعمل بشكل جيد مع سياقات servlet كما هي. يكون هذا واضحًا بشكل خاص إذا قمت بتحميل المكونات الإضافية من مجلد WEB-INF/lib
أو مجلد classes
. ما لم تقم بإضافة ImageIO.scanForPlugins()
في مكان ما في التعليمات البرمجية الخاصة بك، فقد لا تكون المكونات الإضافية متاحة على الإطلاق.
بالإضافة إلى ذلك، تقوم سياقات servlet بتحميل الفئات وإلغاء تحميلها ديناميكيًا (باستخدام محمل فئة جديد لكل سياق). إذا قمت بإعادة تشغيل التطبيق الخاص بك، فستبقى الفئات القديمة افتراضيًا في الذاكرة إلى الأبد (لأنه في المرة التالية التي يتم فيها استدعاء 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
الجديدة، هناك تبعية منفصلة متاحة. إنه يحتوي بالضبط على نفس فئات servlet كما هو مذكور أعلاه، ولكنه مبني على حزم Jakarta EE الجديدة. التبعية لها نفس اسم المجموعة والمعرف كما كان من قبل، ولكن تم إضافة مصنف jakarta
لتمييزها عن الحزمة غير جاكرتا.
راجع مثال تبعية Maven لمعرفة كيفية تمكينه مع Maven. سيكون لدى Gradle أو أدوات البناء الأخرى خيارات مماثلة.
الطريقة الموصى بها لاستخدام المكونات الإضافية هي فقط تضمين ملفات JAR كما هي في مشروعك، من خلال تبعية Maven أو ما شابه. إعادة التغليف ليست ضرورية لاستخدام المكتبة، ولا ينصح بها.
ومع ذلك، إذا كنت ترغب في إنشاء ملف JAR "سمين"، أو ترغب في إعادة تجميع ملفات JAR لسبب ما، فمن المهم أن تتذكر أن الاكتشاف التلقائي للمكونات الإضافية بواسطة ImageIO يعتمد على آلية واجهة مزود الخدمة (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 الإضافية مكتبات تابعة لجهات خارجية
دعم مسار Photoshop لـ 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 أو أي أداة إنشاء أخرى مع إدارة التبعيات، وإضافة التبعيات إلى المكونات الإضافية المحددة التي تحتاجها. إذا كنت لا تستخدم أداة البناء هذه، فتأكد من أن لديك جميع ملفات JAR الضرورية في مسار الفصل. راجع قسم التثبيت أعلاه.
س: ما هي التغييرات التي يجب علي إجراؤها على الكود الخاص بي حتى أتمكن من استخدام المكونات الإضافية؟
ج: الإجابة المختصرة هي: لا شيء. بالنسبة للاستخدام الأساسي، مثل ImageIO.read(...)
أو ImageIO.getImageReaders(...)
، ليست هناك حاجة لتغيير التعليمات البرمجية الخاصة بك. تتوفر معظم الوظائف من خلال واجهات برمجة تطبيقات ImageIO القياسية، وقد تم الحرص على عدم تقديم واجهة برمجة تطبيقات إضافية عندما لا يكون ذلك ضروريًا.
إذا كنت ترغب في استخدام ميزات محددة/متقدمة للغاية لبعض التنسيقات، فقد يتعين عليك استخدام واجهات برمجة تطبيقات محددة، مثل تعيين عنوان URL الأساسي لصورة SVG تتكون من ملفات متعددة، أو التحكم في ضغط إخراج ملف TIFF.
س: كيف يعمل؟
ج: يحتوي مشروع TwelveMonkeys ImageIO على مكونات إضافية لـ ImageIO. يستخدم ImageIO آلية بحث عن الخدمة لاكتشاف المكونات الإضافية في وقت التشغيل.
كل ما عليك فعله هو التأكد من وجود TwelveMonkeys ImageIO JARs في مسار الفصل الدراسي الخاص بك.
يمكنك قراءة المزيد حول السجل وآلية البحث في مستند 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.
لقد فعلنا ذلك