Recentemente, preciso de processamento de compressão de imagem para fazer projetos. A maioria dos métodos que procurei on -line usa a classe JPEGIMageEncoder no pacote com.sun.image.codec.jpeg.*. Depois de introduzir este pacote, relatei erros. Vários Baidu do Google tentaram vários métodos, incluindo o Rt.Jar manualmente no JRE, e a alteração da API restrita ao acesso solicita do erro ao aviso no eclipse, etc. No entanto, estes não são bons, porque mais tarde descobri que não há com.sun. Parece que essa classe foi completamente removida em Java7, pelo menos não tenho versão. Depois, procurei uma solução alternativa para usar a classe Imageio para processamento, o código é o seguinte:
Ele pode ser comprimido para qualquer tamanho, alta definição após a compressão, sem deformação (espaço em branco), o nome do sufixo pode ser alterado e a resolução de compressão pode ser modificada.
Talvez alguns amigos também precisem disso. Por favor, consulte isso. Se você tiver alguma dúvida, por favor me dê algumas evidências!
pacote cn.com.images; importar java.awt.graphics; importar java.awt.image; importar java.awt.image.bufferiMage; importar java.io.file; importar java.io.ioException; importar java.math.bigdecimal; importar java.math.mathcontext; importar java.util.arraylist; importar javax.imageio.imageio; /*** * Operação nas imagens * * @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 (); } retornar imageHelper; } / *** * Escala a imagem na escala especificada * * @param fonte de origem * Endereço de origem * @param DestinationPath * Endereço da imagem depois de alterar o tamanho * @param escala * escala, como 1.2 * / public static void scaleImage (string strocinagePath, string de destino, escala dupla, formato de string) {arquivo file = new (new Source (fonte); BufferImage bufferImage; tente {bufferiMage = imageio.read (arquivo); int width = bufferiMage.getWidth (); int height = bufferiMage.getHeight (); largura = parsedoubletoint (escala de largura *); altura = parsedoubletoint (escala de altura *); Imagem imagem = bufferImage.getScaledInstance (largura, altura, imagem.scale_smooth); BufferImage outputImage = new bufferImage (largura, altura, bufferImage.type_int_rgb); Graphics Graphics = outputImage.getGraphics (); Graphics.Drawimage (imagem, 0, 0, nulo); Graphics.dispose (); Imageio.write (outputImage, formato, novo arquivo (destino de destino)); } catch (ioexception e) {System.out.println ("O erro ocorreu durante a compactação da imagem"); E.PrintStackTrace (); }} / **** Escala a imagem para a altura ou largura especificada* @param fonte de imagem Origemepath Endereço* @param DestinationPath Endereço da imagem Após a compactação da imagem* @param largura largura* @param altura de altura* @param picture como j como jp a altura e largura original da imagem* @param format format como jeaM como jp a altura e a largura da imagem* @param format format como j como jp, como jump, a ratio da imagem da imagem* @param* paramaMaMaMaMaM, como a altura da altura* @ParaM), como a altura da altura* @PARAM, como a imagem da imagem* @PARAM @PARAM, como a altura da imagem* @PARAM. ORONTIMAGEPATH, String DestinationPath, int Warth, int Hight, Boolean Auto, String Format) {try {file file = new File (SourceImagePath); BufferImage bufferImage = nulo; bufferImage = imageio.read (arquivo); if (Auto) {ArrayList <Teger> paramSarrayList = getAUTOWIDTHandHeight (bufferImage, largura, altura); largura = paramSarrayList.get (0); altura = paramSarrayList.get (1); System.out.println ("Auto-ajuste a escala, Width ="+Width+"ScaleImageWithParams Método Erroado ao comprimir imagens"); E.PrintStackTrace (); }} / ** * Converta dados de tipo duplo em int, princípio de arredondamento * * @param soucedle * @return * / private static int parsedoubleToint (duplo soucedle) {int resultado = 0; resultado = (int) azedo; resultado de retorno; } / ***** @param bufferImage O objeto de imagem a ser escalado* @param width_scale largura para escalar para* @param altura_cale A altura para escalar para* @returbar uma coleção, o primeiro elemento é largura e o segundo elemento é a altura* / private Static Arraylist <Teger> ArrayList <Teger> ArrayList = new ArrayList <Teger> (); int width = bufferiMage.getWidth (); int height = bufferiMage.getHeight (); duplo escala_w = getDot2Decimal (width_scale, largura); System.out.println ("getAUTOWIDTHandHeightScale_W ="+SCALE_W); Double Scale_H = getDot2Decimal (Hight_Scale, altura); if (scale_w <scale_h) {ArrayList.add (parsedoubletoint (scale_w*width)); ArrayList.add (parsedoubleToint (escala_w*altura)); } else {ArrayList.add (parsedoubleToint (scale_h*width)); ArrayList.add (parsedoubleToint (escala_h*altura)); } retornar ArrayList; }/*** * Retorne a representação dos três pontos decimais dos dois números a/b * @param a * @param b * @return */public static duplo getDot2decimal (int a, int b) {bigdecimal bigdecimal_1 = novo bigdecimal (a); Bigdecimal bigdecimal_2 = novo bigdecimal (b); Bigdecimal bigdecimal_result = bigdecimal_1.divide (bigdecimal_2, new MathContext (4)); Duplo duplo1 = novo duplo (bigdecimal_result.toString ()); System.out.println ("O duplo após a divisão é:"+double1); retornar duplo1; }}