Я разрабатываю java приложение Swing, используя Eclipse. здесь я пытаюсь создать страницу с водяным знаком на некоторых страницах экрана.
Я использую JLabel в качестве контейнера для получения водяного знака изображения
на страницах:
BufferedImage bi = ImageIO.read( "photoFile" ) ;
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
ImageIO.write( bi , "jpg" , bos ) ;
byte[] data = bos.toByteArray () ;
data = getBackground( "text" , data ) ;
JLabel background = new JLabel ( new ImageIcon ( data ) ) ;
background.setPreferredSize( new Dimension ( 1700 , 3500 ) ) ;
background.add( components )
getBackground содержит следующий код:
public static byte[] getBackground(String text, byte[] imageByte) throws IOException {
// initializes necessary graphic properties
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
BufferedImage image = ImageIO.read(bis);
Graphics2D w = (Graphics2D) image.getGraphics();
w.drawImage(image, 0, 0, null);
AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f);
w.setComposite(alphaChannel);
w.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
w.setColor(Color.decode( "#FFFFFF" ) ) ;
w.setFont(new Font(Font.ARIAL, Font.ITALIC , 14));
FontMetrics fontMetrics = w.getFontMetrics();
text = text ;
Rectangle2D rect = fontMetrics.getStringBounds(text, w);
w.translate( image.getWidth() / 2.0f , image.getHeight() / 2.0f ) ;
AffineTransform at = new AffineTransform() ;
double opad = image.getHeight() / ( double ) image.getWidth() ;
double angle = Math.toDegrees( Math.atan( opad) ) ;
double idegrees = -1 * angle ;
double theta = ( 2 * Math.PI * idegrees ) / 360 ;
at.rotate( theta ) ;
w.transform( at ) ;
float x1 = ( int ) rect.getWidth() / 2.0f * -1 ;
float y1 = ( int ) rect.getHeight() / 2.0f ;
w.translate( x1 , y1 ) ;
for ( int i = image.getHeight() * -1 ; i < image.getHeight() ; i += 40 ) {
w.drawString( text , 0.0f , i ) ;
}
w.dispose();
//*return
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
encoder.encode(image);
return baos.toByteArray();
}
, когда я открываю первую страницу успешно, но когда я открываю другую страницу с тем же процессом, вызывающим водяной знак, он выдает мне сообщение «java .lang.OutOfMemoryError: Java пространство кучи "
, и когда я проверяю строку, она говорит об ошибке в строке, где" encoder.encode (image); " существует.
Может кто-нибудь сказать мне, что я должен делать или что не так с моим процессом?
Заранее спасибо ..