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:
by this codes i can read datastream from bitmapSource but in this way somthing goes wrong in most of GIF animations.Code: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; } }
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 tru images on a form window by this codes:
when i changeCode: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();
toCode:bitmapSource = decoder->Frames[0];
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.Code:bitmapSource = decoder->Frames[01];
best regards.




Reply With Quote
