Baru -baru ini, saya perlu pemrosesan kompresi gambar untuk melakukan proyek. Sebagian besar metode yang saya cari online menggunakan kelas jpegimageencoder di paket com.sun.image.codec.jpeg.*. Setelah memperkenalkan paket ini, saya telah melaporkan kesalahan. Berbagai Google Baidu telah mencoba berbagai metode, termasuk rt.jar secara manual di JRE, dan mengubah petunjuk API yang dibatasi akses dari kesalahan menjadi peringatan di gerhana, dll. Namun, ini tidak baik, karena kemudian saya menemukan bahwa tidak ada com.sun.image.* Di rt.jar di java-7-openjdk-amd64. Tampaknya kelas ini telah sepenuhnya dihapus di Java7, setidaknya saya tidak punya versi. Kemudian saya mencari solusi alternatif untuk menggunakan kelas ImageOO untuk diproses, kodenya adalah sebagai berikut:
Ini dapat dikompresi ke ukuran apa pun, definisi tinggi setelah kompresi, tanpa deformasi (ruang putih), nama akhiran dapat diubah, dan resolusi kompresi dapat dimodifikasi.
Mungkin beberapa teman juga membutuhkan ini. Silakan merujuknya. Jika Anda memiliki pertanyaan, beri saya beberapa bukti!
paket cn.com.images; impor java.awt.graphics; impor java.awt.image; impor java.awt.image.bufferedimage; impor java.io.file; impor java.io.ioException; impor java.math.bigdecimal; impor java.math.mathcontext; impor java.util.arraylist; impor javax.imageio.imageio; /*** * Operasi pada gambar * * @author chenzheng_java * @since 2011/7/29 * */kelas publik ImageHelper {private static ImageHelper ImageHelper = null; public static ImageHelper getImagehelper () {if (imageHelper == null) {imageHelper = new ImageHelper (); } return ImageHelper; } / *** * Skala gambar pada skala yang ditentukan * * @param SourceImagePath * Alamat sumber * @param DestinationPath * Alamat gambar setelah mengubah ukuran * @param skala * skala, seperti 1.2 * / public static void scaleImage (sourceImAgePath, String DestinationPath, skala ganda, format string) {File = Sumber BARU (SOURCEIMAGEPATH); BufferedImage BufferedImage; coba {bufferedImage = ImageIo.read (file); Int width = bufferedImage.getWidth (); int tinggi = bufferedImage.getHeight (); lebar = parsedubletoint (skala lebar *); tinggi = parsedubletoint (skala tinggi *); Gambar gambar = bufferedImage.getScaledInstance (lebar, tinggi, gambar.scale_smooth); BufferedImage outputImage = BufferedImage baru (lebar, tinggi, bufferedImage.type_int_rgb); Grafik grafis = outputimage.getGraphics (); grafik.drawimage (gambar, 0, 0, null); graphics.dispose (); ImageIO.Write (outputImage, format, file baru (DestinationPath)); } catch (ioException e) {System.out.println ("Kesalahan terjadi saat mengompresi gambar"); e.printstacktrace (); }} / **** Skala gambar ke ketinggian atau lebar yang ditentukan* @param SourceImagepath Alamat Sumber Gambar* @param DestinationPath Alamat gambar setelah mengompres gambar* @param width skala lebar* @param tinggi skala tinggi* @param auto apakah akan secara otomatis mempertahankan rasio stasio public dan lebar public* format format @param SourceImagePath, String DestinationPath, Int Width, Int Height, Boolean Auto, String Format) {coba {File File = File baru (SourceImagePath); BufferedImage bufferedImage = null; bufferedImage = ImageIO.read (file); if (auto) {arrayList <Integer> paramSarrayList = getAutowidThandHeight (bufferedImage, width, height); width = paramsarraylist.get (0); tinggi = paramsarraylist.get (1); System.out.println ("Auto-Adjust the Scale, width ="+width+"ScaleImageWithParams Metode keliru saat mengompresi gambar"); e.printstacktrace (); }} / ** * Konversi data tipe ganda ke int, prinsip pembulatan * * @param Sourcedouble * @return * / private static int parsedoubleToint (double sourcedouble) {int result = 0; hasil = (int) Sourcedouble; hasil pengembalian; } / ***** @param BufferedImage Objek gambar yang akan dikurangi* @param width_scale lebar untuk skala ke* @param height_scale tinggi untuk skala untuk skala untuk* @return koleksi, elemen pertama adalah lebar dan elemen tinggi {bubuk {Buffered, Buffered, Buffede, Buffede, GetAutowidthandhandthander (Buffede, ArrayList <Integer> arrayList = ArrayList baru <Integer> (); Int width = bufferedImage.getWidth (); int tinggi = bufferedImage.getHeight (); ganda scale_w = getDot2Decimal (width_scale, width); System.out.println ("GetAutoWidThandHeightScale_W ="+Scale_W); ganda skala_h = getDot2Decimal (height_scale, height); if (scale_w <scale_h) {arraylist.add (parsedoubletoint (skala_w*lebar)); arraylist.add (parsedoubletoint (skala_w*tinggi)); } else {arraylist.add (parsedoubletoint (skala_h*lebar)); arraylist.add (parsedoubletoint (skala_h*tinggi)); } return arrayList; }/*** * Mengembalikan representasi dari tiga titik desimal dari dua angka a/b * @param a * @param b * @return */public static ganda getDot2Decimal (int a, int b) {BigDecimal BigDecimal_1 = BigDecimal baru (a); BigDecimal BigDecimal_2 = BigDecimal baru (b); BigDecimal BigDecimal_Result = BigDecimal_1.divide (BigDecimal_2, MathContext baru (4)); Double1 = double baru (bigdecimal_result.toString ()); System.out.println ("Divisi Double After adalah:"+Double1); mengembalikan double1; }}