כיצד אוכל לשנות את גודל התמונה באמצעות Java?

1. הקדמה

במדריך זה נלמד כיצד לשנות גודל (גודל) תמונה באמצעות Java. נחקור הן ספריות ליבה של Java והן ספריות צד שלישי בעלות קוד פתוח המציעות את תכונת שינוי גודל התמונה.

חשוב להזכיר שנוכל לשנות את קנה המידה של תמונות גם למעלה וגם למטה. בדוגמאות הקוד במדריך זה, נשנה גודל של תמונות לגדלים קטנים יותר מכיוון שבפועל זה התרחיש הנפוץ ביותר.

2. שנה את גודל התמונה באמצעות Core Java

Core Java מציע את האפשרויות הבאות לשינוי גודל התמונות:

  • שינוי גודל השימוש java.awt.Graphics2D
  • שינוי גודל השימוש תמונה # getScaledInstance

2.1. java.awt.Graphics2D

Graphics2D הוא המעמד הבסיסי לעיבוד צורות דו-ממדיות, טקסט ותמונות בפלטפורמת Java.

נתחיל בשינוי גודל של תמונה באמצעות Graphics2D:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) זורק IOException {BufferedImage resizedImage = new BufferedImage (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = resizedImage.createGraphics (); graphics2D.drawImage (originalImage, 0, 0, targetWidth, targetHeight, null); graphics2D.dispose (); חזרה גודל גודל תמונה; }

בואו נראה איך נראית התמונה לפני ואחרי שינוי הגודל:

ה BufferedImage.TYPE_INT_RGB הפרמטר מציין את דגם הצבע של התמונה. רשימה מלאה של ערכים זמינים זמינה ב- Java הרשמית BufferedImage תיעוד.

Graphics2D מקבל פרמטרים נוספים שנקראים RenderingHints. אנו משתמשים RenderingHints כדי להשפיע על היבטים שונים של עיבוד תמונה והכי חשוב על איכות התמונה וזמן העיבוד.

אנחנו יכולים להוסיף a RenderingHint משתמש ב setRenderingHint שיטה:

graphics2D.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

רשימה מלאה של RenderingHints ניתן למצוא במדריך זה של אורקל.

2.2. Image.getScaledInstance ()

גישה זו באמצעות תמונה הוא פשוט מאוד והוא מייצר תמונות באיכות מספקת:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) זורק IOException {Image resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_DEFAULT); BufferedImage outputImage = BufferedImage חדש (targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); outputImage.getGraphics (). drawImage (resultImage, 0, 0, null); return outputImage; }

בואו נראה מה קורה עם תמונה של משהו טעים:

אנו יכולים גם לכוון את מנגנון קנה המידה לשימוש באחת הגישות הקיימות על ידי מתן ה- getScaledInstance () שיטה עם דגל המציין את סוג האלגוריתם שישמש לצרכים שלנו לדגימת תמונות:

תמונה resultImage = originalImage.getScaledInstance (targetWidth, targetHeight, Image.SCALE_SMOOTH);

כל הדגלים הזמינים מתוארים בתיעוד הרשמי של Java Image.

3. Imgscalr

Imgscalr משתמש Graphic2D ברקע. יש לו ממשק API פשוט עם כמה שיטות שונות לשינוי גודל התמונה.

Imgscalr מספקת לנו את התוצאה הנראית הכי טובה, את התוצאה המהירה ביותר, או תוצאה מאוזנת בהתאם לאופציה של קנה המידה שאנו בוחרים. תכונות אחרות של מניפולציה של תמונות זמינות גם - כמו אלה לחיתוך וסיבוב. בואו נראה כיצד זה עובד בדוגמה פשוטה.

נוסיף את התלות הבאה של Maven:

 org.imgscalr imgscalr-lib 4.2 

בדוק את הגרסה האחרונה של Maven Central.

הדרך הפשוטה ביותר להשתמש ב- Imgscalr היא:

BufferedImage simpleResizeImage (BufferedImage originalImage, int targetWidth) זורק Exception {return Scalr.resize (originalImage, targetWidth); }

איפה תמונה מקורית האם ה BufferedImage לשנות את גודלו ו targetWidth הוא הרוחב של תמונת התוצאה. גישה זו תשמור על פרופורציות התמונה המקוריות ותשתמש בפרמטרי ברירת מחדל - שיטה. אוטומטי ו מצב. אוטומטי.

איך זה עושה עם תמונה של פירות טעימים? בוא נראה:

הספרייה מאפשרת גם אפשרויות תצורה מרובות, והיא מטפלת בשקיפות התמונה ברקע.

הפרמטרים החשובים ביותר הם:

  • מצב - משמש להגדרת מצבי שינוי הגודל בהם ישתמש האלגוריתם. לדוגמא, אנו יכולים להגדיר אם ברצוננו לשמור על פרופורציות של התמונה (האפשרויות הן AUTOMATIC, FIT_EXACT, FIT_TO_HEIGHT ו- FIT_TO_WIDTH)
  • שיטה - מורה על תהליך שינוי גודל כך שהתמקדותו תהיה במהירות, באיכות או בשניהם. ערכים אפשריים הם אוטומטי, מאוזן, איכות, מהירות, ULTRA_QUALITY

ניתן גם להגדיר מאפייני שינוי גודל נוספים שיספקו לנו רישום או לכוון את הספרייה לבצע שינויים צבעוניים בתמונה (להפוך אותה לבהירה יותר, כהה יותר, בגווני אפור וכן הלאה).

בואו נשתמש במלואו שינוי גודל () פרמטריזציה של שיטה:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) זורק חריג {return Scalr.resize (originalImage, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, targetWidth, targetHeight, Scalr.OP_ANTIALIAS); }

ועכשיו אנחנו מקבלים:

Imgscalr עובד עם כל הקבצים הנתמכים על ידי Java Image IO - JPG, BMP, JPEG, WBMP, PNG ו- GIF.

4. תמונה ממוזערת

תמונה ממוזערת היא ספריית גודל תמונה של קוד פתוח עבור Java המשתמשת בקנה מידה דו-שנתי פרוגרסיבי. הוא תומך ב- JPG, BMP, JPEG, WBMP, PNG ו- GIF.

אנו נכלול אותו בפרויקט שלנו על ידי הוספת התלות הבאה של Maven שלנו pom.xml:

 net.coobird ממוזערת 0.4.11 

ניתן למצוא גרסאות תלות זמינות ב- Maven Central.

יש לו ממשק API פשוט מאוד ומאפשר לנו להגדיר את איכות הפלט באחוזים:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) זורק חריג {ByteArrayOutputStream outputStream = חדש ByteArrayOutputStream (); Thumbnails.of (originalImage) .size (targetWidth, targetHeight) .outputFormat ("JPEG") .outputQuality (1) .toOutputStream (outputStream); בתים [] נתונים = outputStream.toByteArray (); ByteArrayInputStream inputStream = ByteArrayInputStream חדש (נתונים); להחזיר ImageIO.read (inputStream); }

בואו נראה איך נראה התצלום המחייך הזה לפני ואחרי שינוי הגודל:

יש לו גם אפשרות לעיבוד אצווה:

Thumbnails.of (קובץ חדש ("נתיב / לספרייה"). ListFiles ()). גודל (300, 300) .outputFormat ("JPEG") .outputQuality (0.80) .toFiles (שנה שם.

בתור Imgscalr, Thumblinator עובד עם כל הקבצים הנתמכים על ידי Java Image IO - JPG, BMP, JPEG, WBMP, PNG ו- GIF.

5. מרווין

מרווין הוא כלי שימושי למניפולציה של תמונות והוא מציע הרבה תכונות בסיסיות שימושיות (חיתוך, סיבוב, הטיה, היפוך, קנה מידה) ומתקדמות (טשטוש, הבלטה, טקסטורה).

כמו בעבר, נוסיף תלות של Maven הדרושים לשינוי גודל מרווין:

 com.github.downgoon marvin 1.5.5 pom com.github.downgoon MarvinPlugins 1.5.5 

ניתן למצוא גרסאות תלות של מרווין ב- Maven Central, יחד עם גרסאות ה- Marvin Plugins.

החיסרון של מרווין הוא שהוא אינו מציע תצורת קנה מידה נוספת. כמו כן, שיטת קנה המידה דורשת שיבוט תמונה ותמונה שהוא מעט מסורבל:

BufferedImage resizeImage (BufferedImage originalImage, int targetWidth, int targetHeight) {MarvinImage image = New MarvinImage (originalImage); קנה מידה = קנה מידה חדש (); scale.load (); scale.setAttribute ("newWidth", targetWidth); scale.setAttribute ("newHeight", targetHeight); scale.process (image.clone (), תמונה, null, null, false); להחזיר image.getBufferedImageNoAlpha (); }

בואו עכשיו לשנות את גודל הדימוי של הפרח ונראה איך זה הולך:

6. שיטות עבודה מומלצות

עיבוד תמונות הוא פעולה יקרה מבחינת משאבים, אז בחירת האיכות הגבוהה ביותר אינה בהכרח האפשרות הטובה ביותר כשאנחנו לא באמת צריכים את זה.

בואו נראה את הביצועים של כל הגישות. לקחנו אחד 1920 × 1920 פיקסלים תמונה, ומדרג אותה ל 200 × 200 פיקסלים. הזמנים שנצפו כתוצאה הם כדלקמן:

  • java.awt.Graphics2D - 34ms
  • Image.getScaledInstance () - 235ms
  • Imgscalr - 143ms
  • תמונה ממוזערת - 547ms
  • מרווין - 361ms

כמו כן, תוך הגדרת רוחב וגובה תמונת היעד, עלינו לשים לב ליחס הממדים של התמונה. דרך זו תמונה תשמור על הפרופורציות המקוריות שלה ולא תתמתח.

7. מסקנה

מאמר זה המחיש כמה דרכים לשנות את גודל התמונה בג'אווה. למדנו גם כמה גורמים שונים יכולים להשפיע על תהליך הגודל.

דוגמאות קוד מלאות זמינות ב- GitHub.