|
i am using the freeimage library to display 32 bit bitamp with alpha
channel . I am using the following code
//--------------------------------------------
::SetDIBitsToDevice(
pDC->m_hDC, // handle to DC
xDst, yDst, // x-y-coord of destination upper-left corner
dxSrc, dySrc, // width-height of source rectangle
xSrc, ySrc, // x-y-coord of source upper-left corner
0,//uStartScan,// first scan line in array
FreeImage_GetHeight(pFIBitmap), // number of scan lines
FreeImage_GetBits(pFIBitmap), // array of DIB bits
FreeImage_GetInfo(pFIBitmap), // bitmap information
DIB_RGB_COLORS); // RGB or palette indexes
//-----------------------------------------------------------
In my 32 bit bitmap alpha channel value is 0 i.e must be transparent
on rendering device context. but is it not happening it is not
transparent (FULL BLACK). same problem occuring with 32 bit targa files
can any one suggest me the solution ????
Trioum
|
|
|
|
|
AFAIK, there's no alpha channel support in GDI. There's no BITMAPINFO type that represents 32-bit ARGB
format.
GDI+ will work though.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
But GDI+ is not displaying 32 bit bitmap and targa files.
I try a lot (googling MSDN)
how can I do it ????????.
Trioum
|
|
|
|
|
The 32-bit GDI device-independent-bitmap format is either BI_BITFIELDS, where a bitmask
determines which bits of the 32 represent the red/green/blue compnents, or BI_RGB, where
each 32-bit pixel DWORD is in 0BGR format (the extra byte is ignored).
A GDI+ Image or Bitmap, however, can be created with the format PixelFormat32bppARGB, and
the Graphics class DrawImage() methods will honor the per-pixel alpha channel bytes, as long as
the compositing mode is set correctly (CompositingModeSourceOver).<mshelp:keyword index="K" term="CompositingModeSourceCopy" vtopic="CompositingModeSourceCopy">
I don't know anything about the graphics library you're using, but you should be able to create
a GDI+ Bitmap object from the bitmap info you have, using one of the Bitmap class constructors.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Now I write the following code with GDI+
Gdiplus::Graphics graphics(hdc); //Handle to the device context
//Load the image from a file
Gdiplus::Image image(L"file.bmp",FALSE);
graphics.DrawImage(&image,0,0,image.GetWidth(), image.GetHeight());
this is working fine with 24bit bmp jpeg png jif etc but not working
with 32 bit bitmap and targa files.
although as you write above then how can I draw the bitmap using
drawimage() method if I create it by Bitmap constructor
static Bitmap* FromFile() . as Drawimage() method always take Image()
constructor reference as its first variable not Bitmap().
Trioum
|
|
|
|
|
Bitmap is derived from Image, so you can pass a Bitmap object to DrawImage.
GDI+ doesn't load targa files AFAIK, so you'll need to load those some other way.
BMP, GIF, JPEG, EXIF, PNG, and TIFF are loadable by GDI+.
Whatever solution you use - A DIBSection and AlphaBlend() like Chris suggested, or GDI+
like I suggested, you'll probably need to load the image with your library, and if the library doesn't
support rendering the image, then you'll need to convert the loaded image to one of the GDI(+)
types mentioned.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: AFAIK, there's no alpha channel support in GDI.
sure there is: AlphaBlend[^]
Mark Salsbery wrote: There's no BITMAPINFO type that represents 32-bit ARGB
format.
DIBs (and HBITMAPs) can certainly handle 32-bit BGRA.
|
|
|
|
|
AlphaBlend() is for DDBs, and only DIBSections support ARGB.
That combo is indeed a solution, but why, when GDI+ provides much more support?
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: AlphaBlend() is for DDBs
well, sure, but it's a trivial matter to get from a DIB to an HBITMAP.
Mark Salsbery wrote: but why, when GDI+ provides much more support?
that's something only the OP can address...
|
|
|
|
|
Chris Losinger wrote: a trivial matter to get from a DIB to an HBITMAP
Ok. It's also trivial to make a GDI+ Bitmap from a DIB.
The OP has been provided two possible solutions. Both rely on getting the alpha channel data from
his source pixel data, which is the real problem. The rendering is easy, but SetDIBitsToDevice
isn't going to do it.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
convert your DIB to an HBITMAP, then use AlphaBlend to draw the HBTIMAP
|
|
|
|
|
I tried lot of coding but could not success . can any one send me the piece of code so that I solve my problem.
Trioum
|
|
|
|
|
If I knew anything about the third party libary you use to load the image,
I could easily send you a code sample.
The library doesn't have any rendering code for ARGB images?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Here's an AlphaBlend() example, using what I know from your sample code.
Note this assumes the FreeImage image is 32bpp with alpha channel...
<font color="Green">
LONG lImageWidth = FreeImage_GetWidth(pFIBitmap);
LONG lImageHeight = FreeImage_GetHeight(pFIBitmap);
WORD wBitsPerPixel = 32;
LONG lBytesPerRow = (((lImageWidth * (long)wBitsPerPixel + 31L) & (~31L)) / 8L);
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = lImageWidth;
bmi.bmiHeader.biHeight = lImageHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = wBitsPerPixel;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = lBytesPerRow * lImageHeight;
<font color="Green">
HDC hdc = ::CreateCompatibleDC(0);
BYTE* pBitmapBits;
HBITMAP hBitmap = ::CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**)&pBitmapBits, NULL, 0);
if (hBitmap)
{
<font color="Green">
<font color="Green">
memcpy(pBitmapBits, FreeImage_GetBits(pFIBitmap), bmi.bmiHeader.biSizeImage);
HGDIOBJ hOldBitmap = ::SelectObject(hdc, hBitmap);
HDC hClientDC = ::GetDC(hwndWindowToDrawOn);
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xFF;
bf.AlphaFormat = AC_SRC_ALPHA;
::AlphaBlend(hClientDC, 0, 0, lImageWidth, lImageHeight,
hdc, 0, 0, lImageWidth, lImageHeight, bf);
::ReleaseDC(hwndWindowToDrawOn, hClientDC);
::SelectObject(hdc, hOldBitmap);
::DeleteObject(hBitmap);
}
::DeleteDC(hdc);
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks mark it is working with 32 bit bmp file,but it changes the
alpha value of whole pixels not alpha channel that I wants.
Trioum
|
|
|
|
|
trioum wrote: it changes the
alpha value of whole pixels not alpha channel that I wants.
Huh? What does it do and what do you want?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi
I am Using VS 6 And working in VC++
i want to disable the cancel button on clicking the ok button.....How to do it
Edit/Delete Message
AbidBhat
|
|
|
|
|
CWnd* p = GetDlgItem(IDCANCEL);
p->EnableWindow(FALSE);
Maxwell Chen
|
|
|
|
|
Thanks
But on adding these lines......it gives an error msg as
error C2501: 'CWnd' : missing storage-class or type specifiers
error C2501: 'p' : missing storage-class or type specifiers
left of '->EnableWindow' must point to class/struct/union
Error executing cl.exe.
AbidBhat
|
|
|
|
|
Your project is Win32 type, right?
HWND h = ::GetDlgItem(hYourDlgHandle, IDCANCEL);
::EnableWindow(h, FALSE);
Maxwell Chen
|
|
|
|
|
Thanks chen
yes it working fine
once again thank u
AbidBhat
|
|
|
|
|
Or if you have handle to button you dont need to use of GetDlgItem.
|
|
|
|
|
Hello everyone,
I am reviewing the exception safety of some code and met with some issues about exception safety in string, which I can not find the answer at hand. I think the 3 code segments may all throw exceptions. Because the storage of string internal character data is on heap (using allocator for char?), so when there is low memory, there will be bad_alloc exception?
1. Initialization
string str1 = "Hello";
2. Assignment
string str2 = str1;
3. Empty construction
string str;
I am not quite sure about (3).
thanks in advance,
George
|
|
|
|
|
I believe that the STL string object will not allocate storage until required or directly requested. So #3 should not be expected to throw an exception.
Note, if the string object you are using is doing something extra, such as using a private/high-performance heap, you cannot know if the heap if being initialized when the first string object is instantiated.
Also note - the exception could also be thrown for other reasons, like heap corruption or address space exhaustion, so do not presume that it can be thrown only when you are out of memory.
Peace!
-=- James Please rate this message - let me know if I helped or not!<hr></hr> If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! See DeleteFXPFiles
|
|
|
|
|
Thanks James,
1.
James R. Twine wrote: I believe that the STL string object will not allocate storage until required or directly requested. So #3 should not be expected to throw an exception.
I am using Visual Studio. I am interested to find more information about whether in my specific version of STL implementation, for empty string, whether there will be any space allocation. But in file string, there is no constructor for basic_string. Do you know where to find it? (I believe I should look at the constructor for string, which is the same as the constructor for basic_string)
2.
James R. Twine wrote: heap corruption
Is it structured exception or C++ exception? I belive it is structured exception. But I am talking about C++ exception.
3.
James R. Twine wrote: address space exhaustion
You mean we reserved a lot of space in virtual memory, but not commit?
regards,
George
|
|
|
|
|