Solved

Decompress and display jpeg image from memory (not file!)

Posted on 1997-09-29
8
856 Views
Last Modified: 2008-03-17
I know I can read and display jpeg images directly from a jpeg file, but I've got a jpeg image (compressed) already in memory (via native code out of a QuickTime movie).
Can I utilize Java methods to decompress (and then display) this jpeg image directly from memory?
0
Comment
Question by:riemer
  • 4
  • 4
8 Comments
 
LVL 3

Expert Comment

by:gwalters
ID: 1227639
I know this sounds inefficient, but given the complexity of decompressing JPEG (and the fact that Toolkit.getImage triggers native code to do the actual decoding), it may be more efficient than decompressing in java (which would be the other, more difficult way to do it):

Save the memory buffer to a temporary file.
Load the temporary file with Toolkit.getImage()


BTW, if you wanted GIF, I could give you a class that does it (and also supports GIF animations!)


0
 

Author Comment

by:riemer
ID: 1227640
Thanks for the instant answer BUT:
Sorry, that's not what I want. I'm keeping compressed jpeg images in memory to have a sort of cache to
a) speed up image re-display e.g. from a slower net or cdrom I/O and
b) keep it compressed to save wasting memory like a raw image would do.

Writing it to a local disk and reading it back is still costing too much time for me.
0
 
LVL 3

Expert Comment

by:gwalters
ID: 1227641
Well, it will HAVE to be uncompressed in order to be displayed!


0
 

Author Comment

by:riemer
ID: 1227642
I DO agree. Currently I'm using a native jpeg library which is probably less efficient **) (I hope) than a genuine Java solution doing it all with its Java jpeg library I can see e.g. in win95 "jpeg.dll".

**) less efficient is: I/O + decompress (60 % of the time) + display (40 %) (100 % = 300 ms for a 256x256 image on a Pentium 120 MHz) - I'm hoping to reduce the 60 % portion.
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 3

Accepted Solution

by:
gwalters earned 100 total points
ID: 1227643
OK.  Here's another answer:

------------------BEGIN jpeg.java---------------------------
import sun.awt.image.*;
import java.io.*;

public class jpeg extends InputStreamImageSource {
  InputStream in;
  public jpeg(byte[] data) {
    in=new ByteArrayInputStream(data);    
  }

  public boolean checkSecurity(Object obj, boolean flag) {
    return true;
  }

  protected ImageDecoder getDecoder() {
    return new JPEGImageDecoder(this,in);
  }
}
--------------------END jpeg.java-----------------------------

Now, let's say you have a jpeg in a byte[] foo.  Just do this:

Image img=Toolkit.getDefaultToolkit().createImage(new jpeg(foo));



Beware of using the sun.* classes, though.  Unlike the java.* classes, they are not supported, documented, or even guaranteed to be there!


0
 

Author Comment

by:riemer
ID: 1227644
I'm tempted to grade your answer as "Good" - if there really is no 100% pure Java solution ... isn't there any, how sure are you?
(I'm hesitating to put something in which is not 100% pure Java)
0
 
LVL 3

Expert Comment

by:gwalters
ID: 1227645
No, I'm sure there is a 100% pure java solution.

1) I don't have JPEG code (like I said, I already wrote a class for GIF, 100% java).
2) It would probably be slow.

You may want to try it, though.  See if you can find JPEG code in C, then port it to Java.  I can give you my GIF code as a guide on how images work in Java.


0
 

Author Comment

by:riemer
ID: 1227646
Thanks for your last comment. I DO need speed. I've been hoping for a 100% pure STANDARD Java solution - possibly internally in native code like (I suppose) some of the display functions are to speed it up (e.g. using the win95 jpeg.dll). I think I'll have to go back to my own native code and port it from platform to platform (written in C and - important for me - quite FAST)

0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
countHi challenge 25 84
stringclean challenge 26 56
Requested array size exceeds VM limit 3 48
Java array passed to SQL where clause 23 43
Are you developing a Java application and want to create Excel Spreadsheets? You have come to the right place, this article will describe how you can create Excel Spreadsheets from a Java Application. For the purposes of this article, I will be u…
Java functions are among the best things for programmers to work with as Java sites can be very easy to read and prepare. Java especially simplifies many processes in the coding industry as it helps integrate many forms of technology and different d…
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
Viewers will learn about if statements in Java and their use The if statement: The condition required to create an if statement: Variations of if statements: An example using if statements:

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

27 Experts available now in Live!

Get 1:1 Help Now