Click here to Skip to main content
15,891,657 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
hi.
first of all sorry for my bad english.
i need make a CBitmap or a streamdata from a System.Windows.Controls::Image(rendered out put)in a SDI mfc application (supporting \clr).
here is my codes:
C++
using namespace System;
using namespace System::IO;
using namespace System::Collections::Generic;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Imaging;
using namespace System::Threading;
using namespace System::Security;

bool CGifdecoder::Decoder()  
{
UINT Stride;
unsigned short *res;
unsigned short Buff[ROW * COLUMN];
BitmapSource^ bitmapSource ;
String ^ str = gcnew String(Files[m_Current].Filepath);
// Open a Stream and decode a GIF image
Stream^ imageStreamSource = gcnew FileStream(str, FileMode::Open, FileAccess::Read, FileShare::Read);
GifBitmapDecoder^ decoder = gcnew GifBitmapDecoder(imageStreamSource, BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::Default);              
GifInfo[m_Current].Frames =  decoder->Frames->Count;
 for(int i = 0;i < GifInfo[m_Current].Frames;i++){
Init_ReadDecodedBits();
bitmapSource = decoder->Frames[i];
bpp =  bitmapSource->Format.BitsPerPixel;
Stride = (UINT)(bitmapSource->PixelWidth*(bitmapSource->Format.BitsPerPixel / 8) + 3) & (~3);//bitmapSource->PixelWidth * ((bitmapSource->Format.BitsPerPixel + 7) / 8);
res = new unsigned short[bitmapSource->PixelHeight*bitmapSource->PixelWidth];
			        IntPtr intptr = IntPtr(res); 
			         bitmapSource->CopyPixels(System::Windows::Int32Rect::Empty
             ,intptr,Stride*bitmapSource->PixelHeight, Stride);
for(long j = 0;j<bitmapSource->PixelHeight*bitmapSource->PixelWidth;j++)
	 Buff[j]=ReadParseData(bpp,res);
//here i got unrendered codes from bitmapSource
delete res;
  }
}

by this codes i can read datastream from bitmapSource but in this way somthing goes wrong in most of GIF animations.
after debug i found out i need 3 more things too decode a gif animation - (x,y) position and size of each frame and disposal method for each one - finally i just found a way to draw true images on a form window by this codes:
C++
System::Windows::Window^ mainWindow;
mainWindow = gcnew System::Windows::Window();
               mainWindow->Title = "GIF Imaging Sample";
               //ScrollViewer^ mySV = gcnew ScrollViewer();
array<System::Byte>^ pixels = gcnew array<System::Byte>(bitmapSource->PixelHeight * Stride);
bitmapSource = decoder->Frames[0];
Image^ myImage = gcnew Image();
myImage->Source = bitmapSource;
myImage->Stretch = Stretch::None;
myImage->Margin = System::Windows::Thickness(0);
StackPanel^ myStackPanel = gcnew StackPanel();
myStackPanel->Orientation = Orientation::Vertical;
myStackPanel->VerticalAlignment = VerticalAlignment::Stretch;
myStackPanel->HorizontalAlignment = HorizontalAlignment::Stretch;
myStackPanel->Children->Add(myImage);
// mySV->Content = myStackPanel;
mainWindow->Content = myStackPanel;//mySV;
mainWindow->Width = bitmapSource->PixelHeight;
mainWindow->Height = bitmapSource->PixelHeight;
//mainWindow->ResizeMode = System::Windows::ResizeMode::NoResize;
mainWindow->Show();

when i change
C++
bitmapSource = decoder->Frames[0];

to
C++
bitmapSource = decoder->Frames[1];

frame[1] has drawn perfectly on window(i think some how Image class takes care about - (x,y) position and size of each frame and disposal method for each one ),so im wonder if how can i make a CBitmap or a data stream from System.Windows.Controls::Image class to use in mfc app.
best regards.
Posted
Updated 19-Dec-12 19:45pm
v5

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900