Solved

Loading and display JPEG image from image stream

Posted on 2009-05-13
11
1,250 Views
Last Modified: 2013-12-14
Hi Experts,

Is there anyway I can use MFC or Win32 programming to read a buffer containing JPEG data I extract from the HTTP contents data/ socket stream, render it and display on my application?  Some simple step and API used examples are very much appreciated.
0
Comment
Question by:cskiong
  • 6
  • 5
11 Comments
 
LVL 9

Expert Comment

by:JohnGaby
Comment Utility
You can use the Image class of GDI+ to load a jpeg image from a stream:

http://msdn.microsoft.com/en-us/library/ms535371(VS.85).aspx
0
 

Author Comment

by:cskiong
Comment Utility
Hi JohnGaby,

I have tried to find more info about GDI+ to load a jpeg image from data stream, however I still didn't find what I'm looking for.  I have extract the image data and store into char arrays, what I want is a way to load the data to a Bitmap object and display it.

Steps and Win32/MFC functions used to do as stated, are very much appreciated.
Thank you!
0
 
LVL 9

Expert Comment

by:JohnGaby
Comment Utility
Below is a code snippet which reads a jpeg file into memory, and then uses GDI+ to display the jpeg image from the memory block.  If you use GDI+, be sure that you call the GdiplusStartup function before using any of the classes.

http://msdn.microsoft.com/en-us/library/aa378980(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms534077(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms534462(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms534453(VS.85).aspx
#include <gdiplus.h>

#include <stdio.h>
 

...
 

HGLOBAL LoadFileIntoMemory(LPTSTR pPath)

{

    FILE * fp;

    HGLOBAL hMem    = 0;
 

    if (!_tfopen_s(&fp, pPath, _T("rb")))

    {

        int size;
 

        fseek(fp, 0, SEEK_END);

        size    = ftell(fp);

        fseek(fp, 0, SEEK_SET);
 

        if (hMem = GlobalAlloc(GMEM_MOVEABLE, size))

        {

            LPVOID p = GlobalLock(hMem);
 

            fread(p, size, 1, fp);
 

            GlobalUnlock(hMem);

        }
 

        fclose(fp);

    }
 

    return(hMem);

}
 

void OnPaint(HWND hWnd)

{

    PAINTSTRUCT ps;

    HDC hdc;
 

    hdc = BeginPaint(hWnd, &ps);
 

    HGLOBAL hMem;
 

    if (hMem = LoadFileIntoMemory(_T("c:\\test.jpg")))

    {

        IStream * pStream;
 

        if (CreateStreamOnHGlobal(hMem, TRUE, &pStream) == S_OK)

        {

            Image       image(pStream);

            Graphics    graphics(hdc);
 

            graphics.DrawImage(&image, 0, 0);
 

            pStream->Release();

        }

    }
 

    EndPaint(hWnd, &ps);

}

Open in new window

0
 
LVL 9

Expert Comment

by:JohnGaby
Comment Utility
I ment to put it in my code snippet, but you will also need a

using namespace Gdiplus;

to use the classes without prepending them with 'Gdiplus'
0
 

Author Comment

by:cskiong
Comment Utility
Hi JohnGaby,
Thanks for your references and sample codes.  The code looks fine, but yet to suit my need.  I do not want to load a local image file, nor to create a image file then load it into memory stream using LoadFileIntoMemory(), because I need to real time receiving many different char array from a web server, if I save them into local image file, then load it, and replace with another new local image, it will be not efficient to my application.

Is there a way to load the char array into IStream, or other mehod that can directly convert the char array into bitmap (jpeg???) .  

Maybe just some direct and simple step by step example (function/ API called) will do the great job.  (Sorry for this request, but I'm running out of time to perform the task.)

Thanks!
0
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
LVL 9

Accepted Solution

by:
JohnGaby earned 300 total points
Comment Utility
Well maybe, just maybe, you might try allocating a block of memory using GlobalAlloc as I have done, and then, instead of reading a file, copy your bytes to that block.  Then you can use the CreateStreamOnHGlobal function.
0
 

Author Comment

by:cskiong
Comment Utility
Hi JohnGaby,
Thanks for the suggetion, I'll try and let you know when I have the result.  However, with your code sample, how can I use the MFC Image Control (CStatic) instead of using the graphics.DrawImage to display the image?

Thank you!
0
 
LVL 9

Expert Comment

by:JohnGaby
Comment Utility
I cannot help you with that.
0
 

Author Comment

by:cskiong
Comment Utility
Hi JohnGaby,
Thanks for your suggestion, I copied the image data buffer to the global allocate memory space, then decode it using OleLoadPicture then call the LPPICTURE render().  
Finally it works.

Just a final question, the image is up side down now, is that I need to manupulate the image data before I render, or should I flip it horizontally.  Please advise.

Really appreciate your help!
0
 
LVL 9

Expert Comment

by:JohnGaby
Comment Utility
I am not familiar with the use of OleLoadPicture, so I cannot tell you how to flip the image.  It seems to me, however, that if the source is a jpeg image, then the source must be storing it upside down, and ithat is what that you need to fix.
0
 

Author Closing Comment

by:cskiong
Comment Utility
I found the issue is due to the parameter set in the Render, so the problem is fixed.

Thanks JohnGaby for your advices, you really save my life.
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Introduction: Dialogs (1) modal - maintaining the database. Continuing from the ninth article about sudoku.   You might have heard of modal and modeless dialogs.  Here with this Sudoku application will we use one of each type: a modal dialog …
Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to use and create keystrokes in Netbeans IDE 8.0 for Windows.

744 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

14 Experts available now in Live!

Get 1:1 Help Now