Buffered Image reuse

I have a function like

while(...){
...
BufferedImage  = new BufferedImage(...)
Graphics2D g = (Graphics2D)b.createGraphics();
g.drawImage(...);
}

I mean, i draw an image to different bufferedimages. But i want to use this bufferedimage severel times. (1000 times)
Else, i create buffered image 1000 times, and it is a serious memeory leak.
How to reuse this buuferedimage (change the content)? The next code isnot working properly;

BufferedImage  b = new BufferedImage(...)
while(...){
...
Graphics2D g = (Graphics2D)b.createGraphics();
g.drawImage(...);
}
btocakciAsked:
Who is Participating?
 
objectsConnect With a Mentor Commented:
if you're adding them to a list then you need to create a new ProcessableBufImg for every loop iteration.

0
 
objectsCommented:
just 'clear' it each time with a call to fillRect()
0
 
btocakciAuthor Commented:
thanks object. I tried it, but now, every time when draw sth to its graphics object i see they are drawn incrementally;
while(...){
Graphics og = (Graphics)outImage.createGraphics();
            og.fillRect(0, 0, outImage.getWidth(), outImage.getHeight());
            og.drawImage(stopImage, 0, 0, size.width, size.height, null);
         og.drawRect(...);
}

I see all the rectangles in images. and they are still drawn the same image.

0
Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

 
objectsCommented:
what are you doing with the images?

0
 
btocakciAuthor Commented:

I get frames from a video with jmf. Write it into bufferedimage. Process the image. And draw rectangles into proper positions.

// get frames from video
BufferToImage stopBuffer = new BufferToImage((VideoFormat) frame.getFormat());             
Image stopImage = stopBuffer.createImage(frame);
 
// draw the frame into bufferedimage
outImage = new ProcessableBufImg(size.width, size.height, BufferedImage.TYPE_INT_RGB);
 
while(...){
Graphics og = (Graphics)outImage.getGraphics();
            og.fillRect(0, 0, outImage.getWidth(), outImage.getHeight());
            og.drawImage(stopImage, 0, 0, size.width, size.height, null);
 
// here process the bfferedimage and then draw rectangles
 
og.drawRect(...);
}

Open in new window

0
 
objectsCommented:
what do you do once you have painted each image?

0
 
btocakciAuthor Commented:

// this is my buffer 
static ArrayList<ProcessableBufImg> images = new ArrayList<ProcessableBufImg>();
 
// after painting them i put them to this vector
images.add(outimage);
 
//then  i write this vector's all elements to file
 
ImageIO.write(images.elementAt(i), "jpg", new File(GlobalOpt.outputDirectory+"map\\map"+i+".jpg"));

Open in new window

0
 
btocakciAuthor Commented:
and i want to change it. once i process, i directly want to write it into file.
0
 
btocakciAuthor Commented:
aahh, sorry. they must stay in this arraylist.

just after drawing, i try

ImageIO.write(outimage, "jpg", new File(GlobalOpt.outputDirectory+"map\\map"+i+".jpg"));

and it worked as i want. But after put the image into array list and write to file from beginning of the list to the end, it didnot work.
0
 
btocakciAuthor Commented:
>> if you're adding them to a list then you need to create a new ProcessableBufImg for every loop iteration.

that means, i must create 1000 of them?
0
 
objectsCommented:
yes, because you create a list. Otherwise you are adding the same image to your list 1000 times

0
 
btocakciAuthor Commented:
ooh, that is what i was scared of.
so, there is no way to decrease the memory leakage?
0
 
objectsCommented:
not if you need all 1000 images
you would need to work out a way so you didn't need all the images in a list

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.