Este artigo descreve o método Java de adicionar marcas d'água de imagem, marcas d'água de texto e mosaicos às imagens. Compartilhe -o para sua referência, como segue:
Você pode criar uma nova classe Utils no Eclipse, copiar o código a seguir e usá -lo diretamente, e o método a seguir percebe a adição de marcas d'água únicas ou múltiplas.
pacote com.rzxt.fyx.common.util; importar java.awt.alphacomposite; importar java.awt.color; importar java.awt.font; importar java.awt.graphics2d; importar java.awt.imim; java.io.file; importar javax.Imageio.Imageio; importar javax.swing.imageicon;/** * Adicione uma marca d'água à imagem * @author tgy * */public class MarkImageUtils {/** * @param args */public static void main (string [] args) {string; String fonte = "f: /images/6.jpg"; // Origem da imagem da imagem String icon = "f: /images/icon2.png"; // sobrecover o caminho da imagem string imagename = "mark_image"; // nome da imagem string imageType = "jpg"; // Tipo de imagem JPG, JPEG, PNG, GIF String text = "marca d'água"; int size = 4; // grau inteiro de tamanho em mosaico = nulo; // O ângulo de rotação da marca d'água é -45, nulo significa não girar o resultado da string = nulo; // Adicione a marca d'água da imagem ao resultado da imagem = MarkImageUtils.MarkImageByMoreicon (ícone, fonte, saída, imageName, imageType, grau); // resultado = markImageUtils.markImageBysingleicon (ícone, fonte, saída, imageName, imageType, grau); // Adicione o texto aquático de água à imagem // resultado = markImageUtils.MarkImageByMoreText (fonte, saída, imageName, imageType, color.red, texto, grau); // resultado = markImageUtils.markImageBysingLeTExt (fonte, saída, imageName The ImageType, cor.red, text, grau); MarkImageUtils.MarkImageByMosaic (fonte, saída, nome de imagene, imageType, tamanho); System.out.println (resultado); }/** * Adicione várias marcas d'água de imagem a diferentes locais da imagem e defina o ângulo de rotação da imagem da marca d'água * @Param ICON Watermark Image Path (como: f: /images/icon.png) * @param Fonte AS: 11111) * @param imageType Tipo de imagem (como: jpg) * @param grau o ângulo de rotação da imagem da marca d'água, nulo significa sem rotação */ public static string markimagebymoreicon (ícone de string, fonte de string, string de saída, string imageName, string imageType, grau inteiro) {string resulta = "Error"; tente {arquivo file = novo arquivo (origem); Arquivo ficon = novo arquivo (ícone); if (! file.isfile ()) {return fonte + "não é um arquivo de imagem!"; } // Carregue o ícone na imagem da memória ic = imageio.read (FICON); // altura do ícone int iHeight = ic.getHeight (nulo); // Leia a imagem de origem na imagem da memória img = imageio.read (arquivo); // largura da imagem int width = img.getwidth (null); // altura da imagem int altura = img.getHeight (nulo); BufferImage bi = new bufferImage (largura, altura, bufferImage.type_int_rgb); // Crie um objeto Graphics2D com um gráfico bufferiMage especificado 2D G = bi.CreateGraphics (); // x, os padrões do eixo y para começar de 0 coordenadas int x = 0; int y = 0; // A altura do intervalo das duas imagens da marca d'água é 1/3 da imagem da marca d'água int temp = iHeight/3; int espaço = 1; if (altura> = iHeight) {space = altura/iHeight; if (espaço> = 2) {temp = y = iHeight/2; if (espaço == 1 || espaço == 0) {x = 0; y = 0; }}} else {x = 0; y = 0; } // Defina o processamento de borda irregular do segmento de linha G.SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); // representa uma imagem e converta do espaço da imagem em espaço do usuário antes de desenhar G.Drawimage (img.getScaledInstance (largura, altura, imagem.scale_smooth), 0,0, nulo); para (int i = 0; i <espaço; i ++) {if (null! = graus) {// Defina a rotação da marca d'água g.rotate (math.toradians (grau), (dupla) bi.getwidth () / 2, (duplo) bi.getheight () / 2); } // O caminho da imagem da marca d'água é geralmente gif ou png, para que a transparência possa ser definida Imageicon imgicon = new Imageicon (ícone); // Obtenha o objeto de imagem. Imagem con = imgicon.getImage (); // transparência, o valor mínimo é 0, o valor máximo é 1 clareza de flutuação = 0,6f; g.SetComPosite (alphacomposite.getInstance (alphacomposite.src_atop, clareza)); // indica a posição de coordenadas da imagem da marca d'água (x, y) //g.drawimage(con, 300, 220, nulo); G.Drawimage (con, x, y, nulo); g.SetComPosite (alphacomposite.getInstance (alphacomposite.src_over)); y+= (ICHEight+temp); } g.dispose (); Arquivo sf = novo arquivo (saída, imageName+"."+ImageType); Imageio.write (bi, imageType, sf); // Salvar o resultado da imagem = "A marca d'água do ícone é adicionada após a conclusão da imagem"; } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; }/** * Adicione uma única marca d'água à imagem e defina o ângulo da imagem da marca d'água do ícone da marca d'água * @param (como: f: /images/iCon.png) * @param Fonte Image Path Without Watermark (como: f: /images/6.jpg) * @param saída O caminho da imagem após a marca de água (como a marca de água (f: /images/6.jpg) * * @param o caminho da imagem após uma marca 11111) * @param imageType Tipo de imagem (como: jpg) * @param grau o ângulo de rotação da imagem da marca d'água, nulo significa sem rotação */ public static string markImageBysingleicon (ícone da string, fonte de string, saída de string, string imageName, string imageType, grau integger) {string {string = "error tente {arquivo file = novo arquivo (origem); Arquivo ficon = novo arquivo (ícone); if (! file.isfile ()) {return fonte + "não é um arquivo de imagem!"; } // Carregue o ícone na imagem da memória ic = imageio.read (FICON); // altura do ícone int iHeight = ic.getHeight (nulo); // Leia a imagem de origem na imagem da memória img = imageio.read (arquivo); // largura da imagem int width = img.getwidth (null); // altura da imagem int altura = img.getHeight (nulo); BufferImage bi = new bufferImage (largura, altura, bufferImage.type_int_rgb); // Crie um objeto Graphics2D com um bufferImage especificado. Graphics2d g = bi.creategraphics (); // x, os padrões do eixo y para começar de 0 coordenadas int x = 0; int y = (altura/2)-(iHeight/2); // Defina o processamento de borda irregular do segmento de linha G.SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); // representa uma imagem e converta do espaço da imagem em espaço do usuário antes de desenhar G.Drawimage (img.getScaledInstance (largura, altura, imagem.scale_smooth), 0,0, nulo); if (null! = grau) {// Defina a rotação da marca d'água g.rotate (math.toradians (grau), (dupla) bi.getwidth () / 2, (duplo) bi.getHeight () / 2); } // O caminho da imagem da marca d'água é geralmente gif ou png, portanto a transparência pode ser definida imageicon imgicon = new imageicon (ícone); // Obtenha objeto de imagem. Imagem con = imgicon.getImage (); // transparência, o valor mínimo é 0, o valor máximo é 1 clareza de flutuação = 0,6f; g.SetComPosite (alphacomposite.getInstance (alphacomposite.src_atop, clareza)); // indica a posição de coordenadas da imagem da marca d'água (x, y) //g.drawimage(con, 300, 220, nulo); G.Drawimage (con, x, y, nulo); g.SetComPosite (alphacomposite.getInstance (alphacomposite.src_over)); G.Dispose (); Arquivo sf = novo arquivo (saída, imageName+"."+ImageType); Imageio.write (bi, imageType, sf); // Salvar o resultado da imagem = "A marca d'água do ícone é adicionada após a conclusão da imagem"; } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; } /** * Add multiple text watermarks to the image, and set the watermark text rotation angle* @param source The image path that needs to be added (such as: F:/images/6.jpg) * @param outPut The image output path after adding the watermark (such as: F:/images/) * @param imageName Image name (such as: 11111) * @param imageType Image type (such as: jpg) * @param color A cor do texto da marca d'água* @param word text -marmark* @param grau o ângulo de rotação do texto da marca d'água, o que significa que não é rotação*/ public static string markImageByMoreText (fonte da string, saída da string, string imageName, string imageType, cor, cor, palavra string, grau inteiro) {resultado de string = "Erro adicionando a marca de texto da marca de texto"; tente {// leia o arquivo de informações de imagem original = novo arquivo (origem); if (! file.isfile ()) {return file + "não é um arquivo de imagem!"; } Imagem img = imageio.read (arquivo); // largura da imagem int width = img.getwidth (null); // altura da imagem int altura = img.getHeight (nulo); // tamanho de texto int tamanho = 50; // Adicione a marca d'água bufferImage bi = new bufferiMage (largura, altura, bufferImage.type_int_rgb); Graphics2d g = bi.creategraphics (); G.Drawimage (img, 0, 0, largura, altura, nulo); // Defina a fonte da fonte do estilo da fonte de água = nova fonte ("宋体", font.plain, tamanho); // defina a cor da marca d'água de acordo com o fundo da figura G.setColor (cor); int x = largura/3; int y = tamanho; int espaço = altura/tamanho; for (int i = 0; i <espaço; i ++) {// Se o eixo y da última coordenada for maior que a altura, saia diretamente se ((y+tamanho)> altura) {break; } if (null! = grau) {// Defina a rotação da marca d'água g.rotate (math.toradians (grau), (dupla) bi.getwidth () / 2, (duplo) bi.getHeight () / 2); } g.setFont (fonte); // Posição da marca d'água G.DrawString (Word, X, Y); y+= (tamanho 2*); } g.dispose (); // File de imagem de saída SF = novo arquivo (saída, imageName+"."+ImageType); Imageio.write (bi, imageType, sf); // Salvar o resultado da imagem = "Adicione a marca d'água do Word após a conclusão da imagem"; } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; }/** * Adicione uma única marca d'água de texto à imagem e defina o ângulo de rotação do texto da marca d'água * @param Fonte O caminho da imagem que precisa ser adicionado com uma marca d'água (como: f: /images/6.jpg) * @param saída de imagem o caminho da imagem após uma marca de água (como: f:/imagens/) * @param imagename names @param cor a cor do texto da marca d'água* @param word marca de marca d'água* @param grau o ângulo de rotação do texto da marca d'água, o que significa sem rotação*/ public static string markImageBysingLeText (fonte da string, saída de string, string imageName, string imageType, cor, cor, string word, grau inteiro) {string = "error watermark"; tente {// leia o arquivo de informações de imagem original = novo arquivo (origem); if (! file.isfile ()) {return file + "não é um arquivo de imagem!"; } Imagem img = imageio.read (arquivo); int width = img.getWidth (nulo); int height = img.getheight (nulo); // Adicione a marca d'água bufferImage bi = new bufferiMage (largura, altura, bufferImage.type_int_rgb); Graphics2d g = bi.creategraphics (); G.Drawimage (img, 0, 0, largura, altura, nulo); // Defina a fonte da fonte da fonte da marca d'água = nova fonte ("宋体", font.plain, 50); // defina a cor da marca d'água de acordo com o fundo da figura G.setColor (cor); if (null! = grau) {// Defina a rotação da marca d'água g.rotate (math.toradians (grau), (dupla) bi.getwidth () / 2, (duplo) bi.getHeight () / 2); } g.setFont (fonte); int x = largura/3; int y = altura/2; // Posição da marca d'água G.DrawString (Word, X, Y); G.Dispose (); // File de imagem de saída SF = novo arquivo (saída, imageName+"."+ImageType); Imageio.write (bi, imageType, sf); // Salvar o resultado da imagem = "Adicione a marca d'água do Word após a conclusão da imagem"; } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; } /** * Add mosaic to the image* @param source Original image path (such as: F:/images/6.jpg) * @param output After mosaicing, the path to save the image (such as: F:/images/) * @param imageName Image Name (such as: 11111) * @param imageType Image Type (such as: jpg) * @param size Mosaic size, that is, the width and height of each retângulo * @return */ public static string markImageByMosaic (fonte da string, saída da string, string imageName, string imageType, int size) {string resultado = "Ocorreu o erro de mosaico da imagem"; tente {arquivo file = novo arquivo (origem); if (! file.isfile ()) {return file + "não é um arquivo de imagem!"; } BufferImage img = imageio.read (arquivo); // leia a imagem int width = img.getwidth (null); // largura da imagem original int altura = img.getHeight (nulo); // imagem original de altura da imagem bufedImage bi = new bufferiMage (largura, altura, bufferImage.type_int_rgb); // O tamanho da grade em mosaico é muito grande ou muito pequeno se (largura <tamanho || altura <tamanho) {retorna "O tamanho da grade em mosaico é muito grande"; } if (size <= 0) {return "O tamanho da grade de mosaico é muito pequeno"; } int xCount = 0; // desenhe o número em x direção int ycount = 0; // desenhe o número na direção y se (tamanho da largura == 0) {xCount = largura /tamanho; } else {xcount = width / size + 1; } if (altura % de tamanho == 0) {ycount = altura / tamanho; } else {ycount = altura / tamanho + 1; } int x = 0; // x coordenada int y = 0; // y coordenada // desenhe mosaico (desenhar retângulos e preencher cores) gráficos2d g = bi.creategraphics (); for (int i = 0; i <xcount; i ++) {for (int j = 0; j <ycount; j ++) {// tamanho do retângulo em mosaico int mwidth = size; int mHeight = size; if (i == xcount-1) {// o último na direção horizontal não é suficiente para um tamanho mWidth = width-x; } if (j == ycount-1) {// o último na direção vertical não é suficiente para um tamanho MHEight = altura-y; } // O valor RGB da cor do retângulo leva o pixel central int Centerx = x; int Centery = y; if (mWidth % 2 == 0) {Centerx += mWidth / 2; } else {Centerx += (mWidth - 1) / 2; } if (mHeight % 2 == 0) {Centery += MHeight / 2; } else {Centery += (MHeight - 1) / 2; } Cor cor = nova cor (img.getRgb (Centerx, Centery)); g.setColor (cor); G.FillRect (x, y, mwidth, mHeight); y = y + tamanho; // calcule a coordenada y do próximo retângulo} y = 0; // restaurar a coordenada y x = x + tamanho; // calcular a coordenada x} g.dispose (); Arquivo sf = novo arquivo (saída, imageName+"."+ImageType); Imageio.write (bi, imageType, sf); // salve o resultado da imagem = "Mosaic Sucesso"; } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; }}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.