2011-03-28 4 views

답변

1

내 프로젝트에 사용했습니다. IM4Java library - java 용 imagemagick 래퍼. 워터 마킹 예를 들어 http://www.imagemagick.org/Usage/annotating/

+0

이이 JSP로 사용할 수 있습니다에 워터 마크를 추가하는 코드는? –

+0

@ user608576 예, 서버 –

+0

+1에 설치된 imagemagick이어야하며 http://www.selonen.org/arto/netbsd/watermarks.html과 같은 기술을 사용하십시오. 하지만이 작업을 수행하지 않으면 잘 작동하지 않을 것입니다 ... –

4

을 사용할 수 있습니다, 하나에 텍스트 캡션을 추가 할 수 있습니다 Caption 이미지 필터를 사용하여 기존 이미지 : 위의 코드에서

// Image to add a text caption to. 
BufferedImage originalImage = ...; 

// Set up the caption properties 
String caption = "Hello World"; 
Font font = new Font("Monospaced", Font.PLAIN, 14); 
Color c = Color.black; 
Position position = Positions.CENTER; 
int insetPixels = 0; 

// Apply caption to the image 
Caption filter = new Caption(caption, font, c, position, insetPixels); 
BufferedImage captionedImage = filter.apply(originalImage); 

텍스트가 Hello World O를 그려 질 n은 originalImage을 중심으로 검은 색 전경색의 모노 스페이스 글꼴을 14pt로 사용합니다. 상기 코드 originalImage 상단에 watermarkImage를 중첩한다

BufferedImage originalImage = ...; 
BufferedImage watermarkImage = ...; 

Watermark filter = new Watermark(Positions.CENTER, watermarkImage, 0.5f); 
BufferedImage watermarkedImage = filter.apply(originalImage); 

, 센터링 : 워터 마크 영상은 기존의 이미지에 적용하는 경우

대안 적으로, 하나는 Watermark 이미지 필터를 사용하여 불투명도는 50 %입니다.

Thumbnailator는 평범한 구 Java SE에서 실행됩니다. 하나는 타사 라이브러리를 설치할 필요가 없습니다. (그러나 Sun Java 런타임을 사용해야합니다.)

전체 공개 : 나는 Thumbnailator 개발자입니다.

+0

시도했습니다. 하지만 유선 색상으로 이미지를 만듭니다. 이미지 라인을 만들 때해야 할 일이 있습니까? BufferedImage originalImage = ...; BufferedImage watermarkImage = ...; –

+1

@ user608576 :이 문제와 관련하여 Thumbnailator 프로젝트 페이지에서 우연히 보고서를 제출 했습니까? (http://code.google.com/p/thumbnailator/issues/detail?id=10) 문제가 발생한 경우 더 많은 정보를 제공해주십시오. 감사! – coobird

+0

예보고를했는데 이제는 더 자세한 내용을 추가했습니다. –

1

사용이 코드는, 그것은 이미지가 워터 마크로 사용되며, 여기 .. ​​ 를 작동 위치에 장소 (10, 10)

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class WatermarkImage { 

    public static void addWatermark(String localImagePath) { 

    try { 
     BufferedImage image = ImageIO.read(new File(localImagePath)); 
     BufferedImage overlay = ImageIO.read(new File(".\\data\\watermark\\watermark.png")); 

     // create the new image, canvas size is the max. of both image sizes 
     int w = Math.max(image.getWidth(), overlay.getWidth()); 
     int h = Math.max(image.getHeight(), overlay.getHeight()); 
     BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

     // paint both images, preserving the alpha channels 
     Graphics g = combined.getGraphics(); 
     g.drawImage(image, 0, 0, null); 
     g.drawImage(overlay, 10, 0, null); 

     ImageIO.write(combined, "PNG", new File(localImagePath)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 
0

먼저 C에있는 Imagemagick를 인스톨 한후에 : 창에있는 Imagemagick 폴더를 사용하여 \

http://www.imagemagick.org/download/binaries/ImageMagick-6.8.8-7-Q16-x86-dll.exe

설치가 C를 추가하는 동안 : ImageMagick를 \;

변수 PATH의 enviornment 코드

package UploadServlet; 

    import java.io.*; 
    import java.util.*; 

    import javax.servlet.ServletConfig; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    import org.apache.commons.fileupload.FileItem; 
    import org.apache.commons.fileupload.FileUploadException; 
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;   
    import org.apache.commons.fileupload.servlet.ServletFileUpload; 
    import org.apache.commons.io.output.*; 

    /** 
    * Servlet implementation class UploadServlet 
    */ 
    public class UploadServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
private boolean isMultipart; 
private String filePath; 
private int maxFileSize = 50 * 1024; 
private int maxMemSize = 4 * 1024; 
private File file ; 

public UploadServlet() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

public void init(){ 
    // Get the file location where it would be stored. 
    filePath = getServletContext().getInitParameter("file-upload"); 
} 
/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    throw new ServletException("GET method used with " + 
       getClass().getName()+": POST method required."); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    // Check that we have a file upload request 
     isMultipart = ServletFileUpload.isMultipartContent(request); 
     response.setContentType("text/html"); 
     java.io.PrintWriter out = response.getWriter(); 
     if(!isMultipart){ 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Servlet upload</title>"); 
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<p>No file uploaded</p>"); 
     out.println("</body>"); 
     out.println("</html>"); 
     return; 
     } 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     // maximum size that will be stored in memory 
     factory.setSizeThreshold(maxMemSize); 
     // Location to save data that is larger than maxMemSize. 
     factory.setRepository(new File("c:\\temp")); 

     // Create a new file upload handler 
     ServletFileUpload upload = new ServletFileUpload(factory); 
     // maximum file size to be uploaded. 
     upload.setSizeMax(maxFileSize); 

     try{ 
     // Parse the request to get file items. 
     List fileItems = upload.parseRequest(request); 

     // Process the uploaded file items 
     Iterator i = fileItems.iterator(); 

     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Servlet upload</title>"); 
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<h3>Watermark :</h3>"); 
     out.println("Select a file to upload: <br />"); 
     out.println("<form action=\"UploadServlet\" method=\"post\" enctype=\"multipart/form-data\">"); 
     out.println("<input type=\"file\" name=\"file\" size=\"50\" /><br/>"); 
     out.println("<input type=\"submit\" value=\"Upload File\" />"); 
     out.println("</form><br/>"); 
     while (i.hasNext()) 
     { 
     FileItem fi = (FileItem)i.next(); 
     if (!fi.isFormField()) 
     { 
      // Get the uploaded file parameters 
      String fieldName = fi.getFieldName(); 
      String fileName = fi.getName(); 
      //System.out.println("Filename:" + fileName); 
      String contentType = fi.getContentType(); 
      boolean isInMemory = fi.isInMemory(); 
      long sizeInBytes = fi.getSize(); 
      // get application path 
      String webAppPath = getServletContext().getRealPath("/"); 
      //System.out.println("Web Application Path :" + webAppPath); 

      // Write the file 

      file = new File(webAppPath + "ImageTest.jpeg") ; 

      fi.write(file) ; 


      out.println("<br/><h3>Uploaded File :</h3><img src=\"ImageTest.jpeg\" height='300px' width='300px' />"); 

      String command = ""; 
      command = "convert.exe -draw \"gravity south fill black text 0,0 'Watermark' \" \"" + webAppPath + "ImageTest.jpeg \" \""+ webAppPath +"imageTest_result.jpg \""; 
      ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", command); 
      Process p = pb.start(); 
      try { 
       Thread.sleep(1000); 
      } catch(InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 
      out.println("<br/><h3>Watermarked File :</h3><img src=\"imageTest_result.jpg\" height='300px' width='300px' />"); 

     } 

     } 
     out.println("</body>"); 
     out.println("</html>"); 
    }catch(Exception ex) { 
     System.out.println(ex); 
     out.println("<br/><font color='red'><b>"+ex.getMessage()+"</b></font><br/>"); 
    } 
} 

}

2

이하로 사용 최근 비슷한 필요성을 가지고 오히려 도움이 게시물을 발견 : 이 http://www.codeyouneed.com/java-watermark-image/

워터 마크 방법이를 위해 ImgScalr를 사용을 필요한 경우 워터 마크의 크기를 조정하고 이미지의 아래쪽/맨 위 + 워터 마크 이미지에 텍스트 배치를 지원합니다.

/** 
* Generate a watermarked image. 
* 
* @param originalImage 
* @param watermarkImage 
* @param position 
* @param watermarkSizeMaxPercentage 
* @return image with watermark 
* @throws IOException 
*/ 
public static BufferedImage watermark(BufferedImage originalImage, 
     BufferedImage watermarkImage, PlacementPosition position, 
     double watermarkSizeMaxPercentage) throws IOException { 

    int imageWidth = originalImage.getWidth(); 
    int imageHeight = originalImage.getHeight(); 

    int watermarkWidth = getWatermarkWidth(originalImage, watermarkImage, 
      watermarkSizeMaxPercentage); 
    int watermarkHeight = getWatermarkHeight(originalImage, watermarkImage, 
      watermarkSizeMaxPercentage); 

    // We create a new image because we want to keep the originalImage 
    // object intact and not modify it. 
    BufferedImage bufferedImage = new BufferedImage(imageWidth, 
      imageHeight, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics(); 
    g2d.drawImage(originalImage, 0, 0, null); 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

    int x = 0; 
    int y = 0; 
    if (position != null) { 
     switch (position) { 
     case TOPLEFT: 
      x = 0; 
      y = 0; 
      break; 
     case TOPCENTER: 
      x = (imageWidth/2) - (watermarkWidth/2); 
      y = 0; 
      break; 
     case TOPRIGHT: 
      x = imageWidth - watermarkWidth; 
      y = 0; 
      break; 

     case MIDDLELEFT: 
      x = 0; 
      y = (imageHeight/2) - (watermarkHeight/2); 
      break; 
     case MIDDLECENTER: 
      x = (imageWidth/2) - (watermarkWidth/2); 
      y = (imageHeight/2) - (watermarkHeight/2); 
      break; 
     case MIDDLERIGHT: 
      x = imageWidth - watermarkWidth; 
      y = (imageHeight/2) - (watermarkHeight/2); 
      break; 

     case BOTTOMLEFT: 
      x = 0; 
      y = imageHeight - watermarkHeight; 
      break; 
     case BOTTOMCENTER: 
      x = (imageWidth/2) - (watermarkWidth/2); 
      y = imageHeight - watermarkHeight; 
      break; 
     case BOTTOMRIGHT: 
      x = imageWidth - watermarkWidth; 
      y = imageHeight - watermarkHeight; 
      break; 

     default: 
      break; 
     } 
    } 

    g2d.drawImage(Scalr.resize(watermarkImage, Method.ULTRA_QUALITY, 
      watermarkWidth, watermarkHeight), x, y, null); 

    return bufferedImage; 

} 

워터 마크의 크기를 계산하기위한 대응 방법이있다 :

올바른 위치를 선택하는 것이

public enum PlacementPosition { 
    TOPLEFT, TOPCENTER, TOPRIGHT, MIDDLELEFT, MIDDLECENTER, MIDDLERIGHT, BOTTOMLEFT, BOTTOMCENTER, BOTTOMRIGHT 
} 

전체 워터 마크 로직이 방법에 간단한 ENUM 사용

/** 
* 
* @param originalImage 
* @param watermarkImage 
* @param maxPercentage 
* @return 
*/ 
private static Pair<Double, Double> calculateWatermarkDimensions(
     BufferedImage originalImage, BufferedImage watermarkImage, 
     double maxPercentage) { 

    double imageWidth = originalImage.getWidth(); 
    double imageHeight = originalImage.getHeight(); 

    double maxWatermarkWidth = imageWidth/100.0 * maxPercentage; 
    double maxWatermarkHeight = imageHeight/100.0 * maxPercentage; 

    double watermarkWidth = watermarkImage.getWidth(); 
    double watermarkHeight = watermarkImage.getHeight(); 

    if (watermarkWidth > maxWatermarkWidth) { 
     double aspectRatio = watermarkWidth/watermarkHeight; 
     watermarkWidth = maxWatermarkWidth; 
     watermarkHeight = watermarkWidth/aspectRatio; 
    } 

    if (watermarkHeight > maxWatermarkHeight) { 
     double aspectRatio = watermarkWidth/watermarkHeight; 
     watermarkHeight = maxWatermarkHeight; 
     watermarkWidth = watermarkHeight/aspectRatio; 
    } 

    return Pair.of(watermarkWidth, watermarkHeight); 
} 

/** 
* 
* @param originalImage 
* @param watermarkImage 
* @param maxPercentage 
* @return 
*/ 
public static int getWatermarkWidth(BufferedImage originalImage, 
     BufferedImage watermarkImage, double maxPercentage) { 

    return calculateWatermarkDimensions(originalImage, watermarkImage, 
      maxPercentage).getLeft().intValue(); 

} 

/** 
* 
* @param originalImage 
* @param watermarkImage 
* @param maxPercentage 
* @return 
*/ 
public static int getWatermarkHeight(BufferedImage originalImage, 
     BufferedImage watermarkImage, double maxPercentage) { 

    return calculateWatermarkDimensions(originalImage, watermarkImage, 
      maxPercentage).getRight().intValue(); 

} 

다시 모든 크레딧은 http://www.codeyouneed.com/java-watermark-image/ 좋은 샘플.

0

아래 모든 이미지

import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 

public class WatermarkImage { 

    public static void main(String[] args) { 

     File origFile = new File("C:/OrignalImage.jpg"); 
     ImageIcon icon = new ImageIcon(origFile.getPath()); 

     // create BufferedImage object of same width and height as of original image 
     BufferedImage bufferedImage = new BufferedImage(icon.getIconWidth(), 
        icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); 

     // create graphics object and add original image to it 
     Graphics graphics = bufferedImage.getGraphics(); 
     graphics.drawImage(icon.getImage(), 0, 0, null); 

     // set font for the watermark text 
     graphics.setFont(new Font("Arial", Font.BOLD, 30)); 

     //unicode characters for (c) is \u00a9 
     String watermark = "\u00a9 JavaXp.com"; 

     // add the watermark text 
     graphics.drawString(watermark, 0, icon.getIconHeight()/2); 
     graphics.dispose(); 

     File newFile = new File("C:/WatermarkedImage.jpg"); 
     try { 
       ImageIO.write(bufferedImage, "jpg", newFile); 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } 

     System.out.println(newFile.getPath() + " created successfully!"); 

    } 

}

관련 문제