2017-06-25 10 views
-1

私は(ウォーターマークを追加するために)画像中心を計算しようとすると、次の午前 - add-water-to-image、結果が負のxを示し、画像のいくつかのために、ここでは数学の一部です:Javaは画像中心のリターンを計算マイナス陰性の結果

int centerX = (sourceImage.getWidth() - (int) rect.getWidth())/2; 
int centerY = sourceImage.getHeight()/2; 

と全体の機能:

public void addTextWatermark(String text, File sourceImageFile, File destImageFile, int textSize) { 
     try { 
      BufferedImage sourceImage = ImageIO.read(sourceImageFile); 
      Graphics2D g2d = (Graphics2D) sourceImage.getGraphics(); 

      // initializes necessary graphic properties 
      AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f); 
      g2d.setComposite(alphaChannel); 
      g2d.setColor(Color.BLACK.darker()); 
      //Font(fontName, fontStyle, foneSize) 
      g2d.setFont(new java.awt.Font("Arial", Font.BOLD, textSize)); 
      FontMetrics fontMetrics = g2d.getFontMetrics(); 
      //text - input text , g2d - Graphics2D 
      Rectangle2D rect = fontMetrics.getStringBounds(text, g2d); 

      // calculates the coordinate where the String is painted 
      int centerX = (sourceImage.getWidth() - (int) rect.getWidth())/2; 
      int centerY = sourceImage.getHeight()/2; 

      // paints the textual watermark 
      g2d.drawString(text, centerX, centerY); 

      ImageIO.write(sourceImage, "png", destImageFile); 
      g2d.dispose(); 


     } catch (IOException ex) { 
      System.out.println(ex.getMessage().toString()); 
     } 
    } 

数学は、すべての画像のために働くことを確認する方法はあります1-ですか?

2この計算ではjpgpngの間に相違がありますか?

ありがとうございました。それがあっcauseingた

編集


画像サイズ:

1-に(* 3000 3000)大。

2〜小(60 * 60)です。

textSize(g2d.setFont(new java.awt.Font("Arial", Font.BOLD, textSize));) - 32以下。

+0

数値が負の場合、ウォーターマークが実際のイメージよりも大きいことを意味します。このシナリオでは、透かしのサイズをイメージ自体のサイズよりも小さくすることができます。 – BackSlash

+0

さて、 'rect.getWidth()'が 'sourceImage.getWidth()'より大きい場合に起こります。あなたはそれぞれの幅を見ましたか?基本的に、これは、「そのサイズのテキストをすべてその画像に収めることはできません」 –

+0

@BackSlashウォーターマークはちょうど少数の文字で、画像は1200x600pxです。ウォーターマークが大きければ可能でしょうか? –

答えて

0

だから私はこの問題を処理するための2つの方法が見つかりました:xまたはyが透かしはテキストだけを増やす小型にある場合、私はresize-image

2-使用して画像のサイズを変更している0その後、小さい場合

1-サイズ - g2d.setFont(new java.awt.Font("Arial", Font.BOLD, textSize));

すべてのhelp @jon Skeetに感謝します。