java swing java .lang.OutOfMemoryError: Java пространство кучи при добавлении водяного знака на jlabel - PullRequest
0 голосов
/ 03 апреля 2020

Я разрабатываю 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); " существует.

Может кто-нибудь сказать мне, что я должен делать или что не так с моим процессом?

Заранее спасибо ..

...