Este artigo descreve a classe da ferramenta de processamento de imagem do WeChat implementada pelo Java. Compartilhe -o para sua referência, como segue:
Agora, há menos fotos e artigos do lado de fora. Eu li o código de cópia, mas não posso usá -lo. Eu uso o pacote JAR correspondente para processá -lo e muitos são escalados em proporção, que não podem atender às expectativas que eu desejo: esta classe de ferramentas é uma classe baseada em Java baseada no RGB escrito em impressoras WeChat antes.
package com.zjpz.util;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.awt.image.writableSaster; importar java.io.file; importar java.io.ioException; importar javax.imageio.imageio; importar org.slf4j.logger; fright @Slf4J.LoggerFactory;/** **/wechat Image Processing Tool * *Athor Logger = LoggerFactory.getLogger (pictureTool.class); public static void main (string [] args) lança ioexception {file fileOne = new File ("c: //1.jpg"); BufferImage imagefirst = imageio.read (fileOne); Int borda = 0; ImageFirst = Crop (ImageFirst, 0,10,297.300); Arquivo outfile = novo arquivo ("d: //2.jpg"); Imageio.write (imagefirst, "jpg", outfile); // gravar imagem}/ *** x pixel de coordenada de imagem combinada vertical*/ private final static int y_width = 645; / *** O pixel de coordenadas y da imagem padrão, 920, é uma foto geral, 1099 é uma foto de carimbo*/ estática final privada int y_height = 920; / *** Crop x coordena pixels recuados*/ privado estático final int x_retract = 50; / *** Crop y coordenadas pixels recuados*/ privado estático final int y_retract = 50; / ** * A borda da imagem padrão do sistema é 20 */ public final estático int borda = 20; / *** imagem sintética horizontal*/ public static void xpic (string primeiro, string segundo, string out) {try {/* 1 leia a primeira imagem*/ file fileOne = new File (primeiro); BufferImage imagefirst = imageio.read (fileOne); int width = imagefirst.getwidth (); // largura da imagem int alting = imagefirst.getHeight (); // altura da imagem int [] imagearrayfirst = new int [largura * altura]; // leia rgb a partir da imagem imagearfirst = imagefirst.GBB, (0, 0, altura, altura, imagearfirst = imagefirst.GBB, (0, 0, altura, altura, imagearfirst = imagefirst.GBB, (0, 0, altura, altura, imagearfirst = imagefirst.GBB, (0, 0, altura, altura, imagearfirst = imagefirst.GBB, (0, 0, altura, altura, imagearfirst = imagefirst.GBB, (0, 0, altura, altura, imagearrrayfirst = imagefirst.GBB, (0, 0, altura; /* 1 Faça o mesmo para a segunda imagem*/ arquivo filetwo = novo arquivo (segundo); BufferImage imagenscond = imageio.read (filetwo); int widthtwo = imagenscond.getwidth (); // largura da imagem int altingtwo = imagenscond.getheight (); // altura da imagem int [] imagearraySecond = new int [widthtwo * altingtwo]; imagearraySecond = imageSecond.getRgb (0, 0, widthtwo, altura, imagearraysecond, 0, widthtwo); int h = altura; if (altura <altingtwo) {h = heighttwo; } // gerar uma nova imagem bufferImage imageResult = new bufferiMage (largura + widthtwo, h, bufferiMage.type_int_rgb); imageResult.setrgb (0, 0, largura, altura, imagearrayfirst, 0, largura); // Defina rgb imageResult.setrgb (largura, 0, widthtwo, altura, altingtwo, imagearraysegund, 0, widthtwo); Imageio.write (imageResult, "jpg", outfile); // escreva uma imagem} catch (exceção e) {logger.error ("A imagem da síntese horizontal foi erro ...", e); }} / *** Imagem de síntese vertical** @param primeiro* Coloque o caminho da imagem acima* @param segundo* Coloque o caminho da imagem abaixo* @param out* diretório de saída de arquivo* @param borda* imagem de borda reservada* / public static boolean ypic (string primeiro, string, segundo, string out border) {boolean isok = true; tente { /* 1 Leia a primeira imagem* / arquivo fileOne = new File (primeiro); BufferImage imagefirst = imageio.read (fileOne); int width = imagefirst.getwidth (); // largura de imagem int alting = imagefirst.getHeight (); // altura da imagem/* 2 fazem o mesmo para a segunda imagem*/ arquivo filetwo = novo arquivo (segundo); BufferImage imagenscond = imageio.read (filetwo); int widthtwo = imagenscond.getwidth (); // largura de imagem int altingtwo = imagenscond.getheight (); // altura da imagem/ * 1 Leia a primeira imagem começa */ int t_Height = y_Height - altura; // A imagem é uma imagem horizontal, gire 90 graus no sentido anti -horário e escala igualmente se (largura> altura) {imagefirst = girateImageleft90 (imagefirst); } // Equal Scaling ImageFirst = redimensionamento (ImageFirst, y_width, t_height); // tamanho da imagem após a escala width = imagefirst.getwidth (); // altura da largura da imagem = imagefirst.getHeight (); // altura da imagem // Após a escala radical igual, a imagem ainda é muito grande. Corte a imagem booleana a_w, a_h = false; if ((a_w = (largura> y_width)) || (a_h = (altura> t_height))) {// Posição inicial x, y coordenada int s_w = 0, s_h = 0; // Ao cortar x coordena, o atributo de recuo x_retract if (a_w) {int temp = width - y_width; if (temp> x_retract) {temp = x_retract; } else {temp = 0; } s_w = s_w + temp; } // Ao cortar as coordenadas, o atributo de recuo Y_RETRACT se (a_H) {int temp = altura - t_Height; if (temp> y_retract) {temp = y_retract; } else {temp = 0; } s_h = s_h + temp; } imagefirst = Crop (ImageFirst, S_W, S_H, Y_WIDTH, T_HEIUR); width = imagefirst.getWidth (); altura = imagefirst.getHeight (); } int [] imagearrayfirst = new int [(largura - borda) * altura]; // leia rgb imagearrayfirst = imagefirst.getRgb (borda, 0, (largura - borda), altura, imagearrayfirst, 0, (largura - borda)); / * 2Do o mesmo processo para a segunda imagem começa */ int [] imagearraySecond = new int [widthtwo * altingtwo]; imagearraySecond = imageSecond.getRgb (0, 0, widthtwo, altura, imagearraysecond, 0, widthtwo); int w = largura; if (largura <widthtwo) {w = widthtwo; } // altura da imagem int h = altura + altura; // gerar uma nova imagem bufferImage imageResult = new bufferImage (w, h, bufferImage.type_int_rgb); // Resolva o fundo preto, o tipo padrão type_int_rgb são todos 0 e todos são gráficos pretos 2d g = (graphics2d) imageResult.CreateGraphics (); g.setColor (color.white); G.FillRect (0, 0, W, H); // preencha toda a tela g.dispose (); // Deixe a borda imageResult.setrgb (borda, 0, (largura - borda * 2), altura, imagearrayfirst, 0, (largura - borda)); // Defina rgb no meio esquerdo imageResult.setrgb (0, altura, largura, altura, imageRraySult.setrgb (0, altura, widthtwo, altura, imagearraySecond, 0, largura); Arquivo (out); Imageio.write (imageResult, "jpg", outfile); // escreva uma imagem} catch (exceção e) {logger.error ("imagem de síntese perpendicular falhou ...", e); isok = false; } retornar ISOK; } / *** Impressão completa da imagem, escala de imagem e processamento de rotação** @param fonte* Processamento pendente de imagem* @param out* diretório de saída de arquivo após processamento* @param borda* imagem borda reservada* / public static boolean magaópico (fonte de string, string out, int border) {boolean isok = true; tente { /* 1 Leia a primeira imagem* / arquivo fileOne = new File (origem); BufferImage imagefirst = imageio.read (fileOne); int width = imagefirst.getwidth (); // largura da imagem int alting = imagefirst.getHeight (); // altura da imagem // a imagem é uma imagem horizontal, gire 90 graus no sentido anti -horário e escala igualmente se (largura> altura) {imagefirst = rotateImageleft90 (imagefirst); } // Equality Scaling imagefirst = redimensionamento (imagefirst, y_width, y_height); // tamanho da imagem após a escala width = imagefirst.getwidth (); // altura da largura da imagem = imagefirst.getHeight (); // altura da imagem // Após a escala de igualdade, a imagem ainda é muito grande. Corte a imagem booleana a_w, a_h = false; if ((a_w = (largura> y_width)) || (a_h = (altura> y_height))) {// Posição inicial x, y coordenada int s_w = 0, s_h = 0; // Ao cortar x coordena, o atributo de recuo x_retract if (a_w) {int temp = width - y_width; if (temp> x_retract) {temp = x_retract; } else {temp = 0; } s_w = s_w + temp; } // Ao cortar as coordenadas, o atributo de recuo Y_RETRACT se (a_H) {int temp = altura - y_height; if (temp> y_retract) {temp = y_retract; } else {temp = 0; } s_h = s_h + temp; } imageFirst = Crop (ImageFirst, S_W, S_H, Y_WIDTH, Y_HEIUR); width = imagefirst.getWidth (); altura = imagefirst.getHeight (); } int [] imagearrayfirst = new int [(largura - borda) * altura]; // leia rgb a partir da imagem imagearrayfirst = imagefirst.getRgb (borda, 0, (largura - borda), altura, imagearrayfirst, 0, (largura - borda)); // gerar uma nova imagem bufferImage imageResult = new bufferImage (largura, altura, bufferImage.type_int_rgb); // Resolva o fundo preto, o tipo padrão type_int_rgb são todos 0 e todos são gráficos pretos 2d g = (graphics2d) imageResult.CreateGraphics (); g.setColor (color.white); G.FillRect (0, 0, largura, altura); // preencha toda a tela g.dispose (); // Deixe a borda ImageResult.setrgb (borda, 0, (largura - borda * 2), altura, imagearrayfirst, 0, (largura - borda)); // Defina o arquivo de arquivo rgb na metade esquerda = novo arquivo (out); Imageio.write (imageResult, "jpg", outfile); // escreva uma imagem} catch (ioexception e) {logger.error ("impressão de imagem completa, escala de imagem e processamento de rotação falhou ...", e); isok = false; } retornar ISOK; }/ ** * Implementar zoom de radio igual da imagem * * @param fonte * fluxo de imagem a ser processado * @param Targetw * width * @param targeth * altura * @return */ public static bufferImage redimize (bufferImage fonte, Int Targetw, int targeth) {int width = fonte.getwidth (); ZoominImage (fonte, Targetw, Targeth); // A largura e a altura da imagem são muito pequenos, a força aumenta a imagem/* if (largura <TargetW && Height <Targeth) {return ZoominImage (fonte, Targetw, Targeth); } else if ((largura <targetw && width == altura) || (altura <Targeth && width == Height)) {return zoominImage (fonte, Targetw, Targeth); } retornar nulo; */ } /** * Crop the image to scale* * @param source * Pending image stream* @param startX * Start x coordinate* @param startY * Start y coordinate* @param endX * End x coordinate* @param endY * End y coordinate* @return */ public static BufferedImage crop(BufferedImage source, int startX, int startY, int endX, int endY) { int width = fonte.getWidth (); int height = fonte.getHeight (); if (startx <= -1) {startx = 0; } if (starty <= -1) {starty = 0; } if (endX <= -1) {endx = width - 1; } if (endy <= -1) {endy = altura - 1; } Resultado bufferImage = new BufferImage (endX, endy, fonte.getType ()); for (int y = starty; y <endy+starty; y ++) {for (int x = startx; x <endx+startx; x ++) {int rgb = fonte.getRgb (x, y); resultado.setRGB (x - startx, y - starty, rgb); }} Retornar resultado; } / ** * Gire a imagem para o ângulo especificado * * @param bufferImage * imagem de destino * @param grau * gire o ângulo * @return * / public static bufferImage rotateImage (final bufferImage bufferImage, grau final int) {int w = bufferImage.getwidththththththh); int h = bufferiMage.getHeight (); int tipo = bufferImage.getColormodel (). getTransparency (); IMG de bufferImage; Graphics2D Graphics2D; (Graphics2d = (img = new bufferImage (h, w, type)). creategraphics ()). setrenderinghint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); Graphics2d.rotate (Math.Toradians (grau), W / 2, H / 2 + (W> H? (W - H) / 2: (H - W) / 2)); Graphics2d.DrawImage (BufferImage, 0, 0, NULL); Graphics2d.dispose (); devolver img; } / ** * A imagem gira 90 graus * * @param bufferImage * @return * / public static bufferImage girtateImageleft90 (bufferImage bufferImage) {int w = bufferImage.getWidth (); int h = bufferiMage.getHeight (); int tipo = bufferImage.getColormodel (). getTransparency (); IMG de bufferImage; Graphics2D Graphics2D; (Graphics2d = (img = new bufferImage (h, w, type)). creategraphics ()). setrenderinghint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); Graphics2D.Rotate (Math.Toradians (270), W / 2, H / 2 + (W - H) / 2); Graphics2d.DrawImage (BufferImage, 0, 0, NULL); Graphics2d.dispose (); devolver img; } / ** * A imagem gira à direita 90 graus * * @param bufferImage * @return * / public static bufferImage girtateImageright90 (bufferImage bufferImage) {int w = bufferImage.getWidth (); int h = bufferiMage.getHeight (); int tipo = bufferImage.getColormodel (). getTransparency (); IMG de bufferImage; Graphics2D Graphics2D; (Graphics2d = (img = new bufferImage (h, w, type)). creategraphics ()). setrenderinghint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); Graphics2d.rotate (Math.Toradians (90), W / 2 - (W - H) / 2, H / 2); Graphics2d.DrawImage (BufferImage, 0, 0, NULL); Graphics2d.dispose (); devolver img; } // FILD Public FILDIMAGEIMAGEOPPO (arquivo de arquivo) lança Exceção {bufferImage bufferImage = imageio.read (arquivo); int w = bufferiMage.getWidth (); int h = bufferiMage.getHeight (); int tipo = bufferImage.getColormodel (). getTransparency (); IMG de bufferImage; Graphics2D Graphics2D; (Graphics2d = (img = new bufferImage (W, H, Type)). CreateGraphics ()). SetrenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); Graphics2D.Rotate (Math.Toradians (180), W / 2, H / 2); Graphics2d.DrawImage (BufferImage, 0, 0, NULL); Graphics2d.dispose (); Imageio.write (img, "jpg", arquivo); arquivo de retorno; } / *** * Processamento de espelhamento de imagem * * arquivo @param * @param fx * 0 está para cima e para baixo a inversão 1 é a inversão esquerda e direita * @return * / public void imagemisro (arquivo de arquivo, int fx) {tente {bufferImage bufferImage = imageio.read (arquivo); int w = bufferiMage.getWidth (); int h = bufferiMage.getHeight (); int [] [] dados = new int [w] [h]; for (int i = 0; i <h; i ++) {for (int j = 0; j <w; j ++) {datas [j] [i] = bufferiMage.getRgb (j, i); }} int [] [] tmps = new int [w] [h]; if (fx == 0) {for (int i = 0, a = h-1; i <h; i ++, a--) {for (int j = 0; j <w; j ++) {tmps [j] [a] = dados [j] [i]; }}} else if (fx == 1) {for (int i = 0; i <h; i ++) {for (int j = 0, b = w-1; j <w; j ++, b--) {tmps [b] [i] = dados [j] [i]; }}} para (int i = 0; i <h; i ++) {for (int j = 0; j <w; j ++) {bufferiMage.setrgb (j, i, tmps [j] [i]); }} Imageio.write (bufferImage, "jpg", arquivo); } catch (Exceção e) {e.printStackTrace (); }} / ** * Força o zoom dentro ou para fora da imagem * * @param originalImage * originalImage * @return * / public static bufferedimage zoominImage (bufferiMage) originalImage, int width, int alting) {bufferedImage newImage = newBuredImage (largura, altura, original.get.getPe ();); Gráficos g = newImage.getGraphics (); G.Drawimage (OriginalImage, 0, 0, largura, altura, nulo); G.Dispose (); retornar newImage; } / *** Princípio de reconhecimento de imagem simples** @param img* pato de imagem* / public static void discernImg (string img) {try {file fileOne = new File (IMG); BufferImage bi = imageio.read (fileOne); // obtenha a largura e a altura da imagem int width = bi.getWidth (); int height = bi.getHeight (); // verifique a imagem para (int i = 0; i <altura; i ++) {for (int j = 0; j <width; j ++) {// linha scan int dip = bi.getRgb (j, i); if (dip == -1) System.out.print (""); else System.out.print ("♦"); } System.out.println (); // quebra de linha}} catch (Exceção e) {logger.error ("erro de reconhecimento de imagem", e); }}}Para mais conteúdo relacionado a Java, os leitores interessados neste site podem visualizar os tópicos: "Resumo das habilidades de operação da imagem Java", "Resumo da Data e Hora de Java e Habilidades de Operação", "Resumo de Java Operação Dom Node Habilidades", "Resumo dos arquivos Java e habilidades de operação de diretório" e "tutoriais da estrutura de dados Java e Algorithm".
Espero que este artigo seja útil para a programação Java de todos.