2011-03-28 19 views
10

जावा का उपयोग कर छवि पर वॉटरमार्क कैसे बना सकता हूं? मुझे छवि पर प्रदान की गई स्थिति में जोड़े जाने के लिए उपयोगकर्ता द्वारा दर्ज टेक्स्ट की आवश्यकता है। कोई नमूना कोड/सुझाव मदद मिलेगी।मैं जावा में एक छवि वॉटरमार्क कैसे कर सकता हूं?

उत्तर

5

आप http://web.archive.org/web/20080324030029/http://blog.codebeach.com/2008/02/watermarking-images-in-java-servlet.html

की "ड्राइंग वॉटरमार्क" अनुभाग पर देख सकते हैं या आप Thumbnailator में GIF4J पुस्तकालय http://www.gif4j.com/java-gif4j-pro-gif-image-watermark.htm#gifimagewatermarkapply

+0

मैंने इसका इस्तेमाल किया http://blog.codebeach.com/2008/02/watermarking-images-in-java-servlet.html –

1

मैंने अपनी परियोजनाओं के लिए IM4Java library - जावा के लिए छविमैजिक रैपर का उपयोग किया। देख वॉटरमार्किंग उदाहरण के लिए http://www.imagemagick.org/Usage/annotating/

+0

इस JSP के साथ इस्तेमाल किया जा सकता पर वाटर मार्क जोड़ने के लिए कोड है? –

+0

@ user608576 हां, लेकिन यह सर्वर –

+0

+1 पर स्थापित छविमैजिक स्थापित करने की आवश्यकता है और फिर 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 ओ तैयार किया जाएगा एन originalImage पर एक मनोरंजक फ़ॉन्ट के साथ, 14 पीटी पर एक काला अग्रभूमि रंग के साथ केंद्रित है।

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

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

ऊपर कोड originalImage के शीर्ष पर watermarkImage मिलाती हैं जाएगा, एक साथ केंद्रित:

वैकल्पिक रूप से, अगर एक वॉटरमार्क छवि एक मौजूदा छवि के लिए लागू किया जा रहा है, एक Watermark छवि फिल्टर का उपयोग कर सकते 50% की अस्पष्टता।

थंबनेलेटर सादे पुराने जावा एसई पर चलाएगा - किसी को किसी तीसरे पक्ष के पुस्तकालयों को स्थापित करने की आवश्यकता नहीं है। (हालांकि, सन जावा रनटाइम का उपयोग करना आवश्यक है।)

पूर्ण प्रकटीकरण: मैं थंबनेलेटर के लिए डेवलपर हूं।

+0

मैंने यह कोशिश की लेकिन यह कुछ वायर्ड रंगों के साथ छवि बनाता है। क्या छवि चीजों को बनाने के साथ मुझे कुछ करने की ज़रूरत है? BufferedImage मूल छवि = ...; बुफर्ड इमेज वॉटरमार्क इमेज = ...; –

+1

@ user608576: क्या आपने इस मुद्दे के बारे में थंबनेलर प्रोजेक्ट पेज पर एक रिपोर्ट दर्ज की थी? (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

पहले सी में ImageMagick इंस्टॉल: \ windows में ImageMagick फ़ोल्डर का उपयोग कर

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

स्थापना सी जोड़ने जबकि: \ ImageMagick; पथ वातावरण चर

और में कोड

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 का उपयोग करता है आवश्यकता होने पर वॉटरमार्क का आकार बदलना और छवि के नीचे/ऊपर + वॉटरमार्क छवि में पाठ रखने का समर्थन करता है।

सही स्थान चुनने के लिए यह एक सरल Enum

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

और सारी वॉटरमार्किंग तर्क इस विधि में है का उपयोग करता है:

/** 
* 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; 

} 

और वॉटरमार्क आकार की गणना के लिए इसी तरीकों जाता है:

/** 
* 
* @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!"); 

    } 

}

संबंधित मुद्दे