في الآونة الأخيرة ، أحتاج إلى معالجة ضغط الصور للقيام بالمشاريع. معظم الطرق التي بحثت عنها عبر الإنترنت استخدم فئة JPegimageenCoder في الحزمة com.sun.image.codec.jpeg.*. بعد تقديم هذه الحزمة ، أبلغت عن أخطاء. لقد جربت مختلف Google Baidu طرقًا مختلفة ، بما في ذلك RT.JAR يدويًا في JRE ، وتغيير مطالبات API المقيدة من الوصول من خطأ إلى تحذير في Eclipse ، وما إلى ذلك. ومع ذلك ، فهذه ليست جيدة ، لأنني وجدت لاحقًا أنه لا يوجد com.sun.image. يبدو أن هذا الفصل تمت إزالته بالكامل في Java7 ، على الأقل ليس لدي أي إصدار. ثم بحثت عن حل بديل لاستخدام فئة Imageio للمعالجة ، فإن الكود كما يلي:
يمكن ضغطه إلى أي حجم ، وعالي الوضوح بعد الضغط ، دون تشوه (مساحة بيضاء) ، يمكن تغيير اسم لاحقة ، ويمكن تعديل دقة الضغط.
ربما يحتاج بعض الأصدقاء أيضًا إلى هذا. يرجى الرجوع إليها. إذا كان لديك أي أسئلة ، فالرجاء إعطائي بعض الأدلة!
حزمة cn.com.images ؛ استيراد java.awt.graphics ؛ استيراد java.awt.image ؛ استيراد java.awt.image.bufferedImage ؛ استيراد java.io.file ؛ استيراد java.io.ioException ؛ استيراد java.math.bigdecimal ؛ استيراد java.math.mathContext ؛ استيراد java.util.arraylist ؛ استيراد javax.imageio.imageio ؛ /*** * العملية على الصور * * Author Chenzheng_Java * since 2011/7/29 * */public class imageHelper {private static imageHelper imageHelper = null ؛ public static ImageHelper getImageHelper () {if (imageHelper == null) {ImageHelper = new ImageHelper () ؛ } إرجاع ImageHelper ؛ } / *** * قم بتوسيع نطاق الصورة في المقياس المحدد * * param sourceImagePath * عنوان المصدر * param DestinationPath * عنوان الصورة بعد تغيير مقياس الحجم * param * ، مثل 1.2 * / public static void ScaleImage (String sourceImagePath ، String DestinationPath ، مقياس مزدوج ، تنسيق سلسلة) BufferedImage BufferedImage. حاول {bufferedImage = imageio.read (file) ؛ عرض int = bufferedImage.getWidth () ؛ ارتفاع int = bufferedimage.getheight () ؛ العرض = parsedoubletoint (عرض * مقياس) ؛ الارتفاع = parsedoubletoint (الارتفاع * مقياس) ؛ صورة الصورة = bufferedImage.getScaledInstance (العرض ، الارتفاع ، Image.scale_smooth) ؛ bufferedImage outputImage = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ رسومات الرسومات = outputImage.getGraphics () ؛ graphics.drawImage (صورة ، 0 ، 0 ، فارغة) ؛ Graphics.Dispose () ؛ imageio.write (outputImage ، format ، ملف جديد (DestinationPath)) ؛ } catch (ioException e) {system.out.println ("حدث الخطأ أثناء ضغط الصورة") ؛ E.PrintStackTrace () ؛ }} / **** قم بتوسيع نطاق الصورة إلى الارتفاع أو العرض المحدد* param sourceImagePath عنوان مصدر الصورة* param destination addran SourceImagePath ، String DestinationPath ، عرض int ، ارتفاع int ، Auto Auto ، تنسيق السلسلة) {try {file file = new file (sourceImagePath) ؛ BufferedImage BufferedImage = null ؛ bufferedImage = imageio.read (file) ؛ if (Auto) {ArrayList <integer> paramsarrayList = getAutowIdThandheight (BufferedImage ، العرض ، الارتفاع) ؛ العرض = paramsArrayList.get (0) ؛ الارتفاع = paramsArrayList.get (1) ؛ System.out.println ("Auto-enjust المقياس ، العرض ="+width+"methodiMageWithParams Methort عند ضغط الصور") ؛ E.PrintStackTrace () ؛ }} / ** * تحويل بيانات النوع المزدوج إلى int ، مبدأ التقريب * * param sourcedouble * return * / private static int parsedoubletoint (double sourcedouble) {int result = 0 ؛ النتيجة = (int) sourcedouble ؛ نتيجة العودة } / ***** param bufferedImage كائن الصورة المراد تحجيمه* param width_scale عرض لتوسيع نطاقه إلى* param height_scale الارتفاع لتوسيع نطاقه إلى* return مجموعة ، والعنصر الأول هو العرض والعنصر الثاني هو الارتفاع* / arraylist static الخاص <integer> getAutoWIdThandHaight (bufferrededimage). ArrayList <integer> ArrayList = new ArrayList <integer> () ؛ عرض int = bufferedImage.getWidth () ؛ ارتفاع int = bufferedimage.getheight () ؛ double Scale_w = getDot2Decimal (width_scale ، العرض) ؛ System.out.println ("getAutowIdThandheightScale_w ="+Scale_w) ؛ double Scale_h = getDot2Decimal (height_scale ، الارتفاع) ؛ if (scale_w <scale_h) {ArrayList.add (parsedoubletoint (scale_w*width)) ؛ ArrayList.Add (parsedoubletoint (Scale_W*الارتفاع)) ؛ } آخر {ArrayList.add (parsedoubletoint (scale_h*width)) ؛ ArrayList.Add (parsedoubletoint (scale_h*height)) ؛ } return arraylist ؛ }/*** * إرجاع تمثيل النقاط العشرية الثلاث من الرقمين A/B * param a * param b * @return */public static getDot2Decimal (int a ، int b) {bigDecimal bigDecimal_1 = new bigdecimal (a) ؛ BigDecimal BigDecimal_2 = جديد BigDecimal (B) ؛ BigDecimal BigDecimal_Result = bigDecimal_1.divide (BigDecimal_2 ، New MathContext (4)) ؛ double1 = جديد مزدوج (bigdecimal_result.toString ()) ؛ System.out.println ("The Double After Division هو:"+double1) ؛ إرجاع Double1 ؛ }}