Nie zapisuje grafiki do pliku w VS2010 C++/CLI

0

Witam,

Chciałem zapisywać stworzone przeze mnie schematy graficzne do pliku z
wykorzystaniem bitmapy i rysunki w pliku są puste. I nie wiem gdzie jest
błąd. Mam tak:

        
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                        Imaging::ImageFormat^ format=Imaging::ImageFormat::Png;
                        Bitmap^ bmp=gcnew Bitmap(panel1->Width,panel1->Height);
                        Graphics^ gr = panel1->CreateGraphics();
                        gr->FromImage(bmp);   // to ma zapewnić powiązanie obrazka z bitmapą
                        Pen^ pr=gcnew Pen(System::Drawing::Color::Black);
                        gr->Clear(Color::White);
                        gr->DrawEllipse(pr,10,10,180,180);  //koło
                        float x1,y1,x2,y2;
                        x1=37.0f; y1=37.0f;
                        gr->DrawRectangle(pr,x1,y1,126.0f,126.0f); //kwadrat
                        x1=37.0f; y1=37.0f;
                        x2=163.0f; y2=163.0f;
                        gr->DrawLine(pr,x1,y1,x2,y2);  //1 przekątna
                        x1=163.0f; y1=37.0f;
                        x2=37.0f; y2=163.0f;
                        gr->DrawLine(pr,x1,y1,x2,y2);  //2 przekątna
                        bmp->Save("rysunek.png",format); //zapis bitmapy
                        delete bmp; delete pr; delete gr;
                 }   

Ktoś wie, dlaczego w pliku rysunek jest pusty?
Na formatce (panel1) grafika jest OK, tylko jej nie zapisuje.
Panel1 ma wymiar 200x200, jakby ktoś chciał przetestować.
Używam Visual Studio 2010 Express, projekt CLI Windows Forms.

0

gr->FromImage(bmp); // to ma zapewnić powiązanie obrazka z bitmapą

Nie. FromImage jest metodą statyczną klasy Graphics, która zwraca nowego Graphicsa powiązanego z podaną bitmapą. Ponieważ w tej linijce ignorujesz zwracaną przez funkcję wartość, od razu tracisz tego Graphicsa i nic się nie dzieje.

Twoje bmp nie jest w żaden sposób powiązane ani z gr ani z panel1.

Zresztą zdecyduj się, czy chcesz rysować na bitmapie czy na panelu.

jeśli na bitmapie to

Graphics^ gr = Graphics::FromImage(bmp);

a jeśli na „panelu” to użyj lepiej kontrolki PictureBox, która ma pole Image na którym możesz zrobić Graphics::FromImage i rysować, a potem zapisać do pliku tak jak to robisz przez Save.

PS. zamiast

Bitmap^ bmp=gcnew Bitmap(panel1->Width,panel1->Height);

można prościejBitmap bmp(panel1->Width,panel1->Height);

co automatycznie robi `delete` pod koniec funkcji.
0

Dzięki za podpowiedź z tym Graphicsem. Teraz rzeczywiście zapisuje rysunek do pliku, ale mam problem z wyświetleniem bitmapy (rysunku) na pic1 (picturebox). Zwykłe podstawienie pic1->Image=bmp; nie tworzy błędu kompilacji, ale wywala po uruchomieniu, nie wiem czemu. Zrobiłem trochę głupio, po zapisaniu na dysk bitmapy, wczytuję z powrotem do Image. Próbowałem też zamiast Bitmapy użyć Image, ale nie udało mi się tego zrobić bez błędu. Teraz mam tak:

    
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
            Imaging::ImageFormat^ format=Imaging::ImageFormat::Png;
            Bitmap^ bmp=gcnew Bitmap(pic1->Width,pic1->Height);
            Graphics^ gr = Graphics::FromImage(bmp);
            Pen^ pr=gcnew Pen(System::Drawing::Color::Black);
            gr->Clear(Color::White); 
            gr->DrawEllipse(pr,10,10,180,180);
            float x1,y1,x2,y2; 
            x1=37.0f; y1=37.0f;
            gr->DrawRectangle(pr,x1,y1,126.0f,126.0f);
            x1=37.0f; y1=37.0f;
            x2=163.0f; y2=163.0f;
            gr->DrawLine(pr,x1,y1,x2,y2);
            x1=163.0f; y1=37.0f;
            x2=37.0f; y2=163.0f;
            gr->DrawLine(pr,x1,y1,x2,y2);
            //pic1->Image=bmp; //powoduje błąd
            bmp->Save("rysunek.png",format); Sleep(100);
            pic1->Image=Image::FromFile("rysunek.png");
            delete bmp; delete pr; delete gr; 
         }    
0

Zwykłe podstawienie pic1->Image=bmp; nie tworzy błędu kompilacji, ale wywala po uruchomieniu, nie wiem czemu

Nie delete'uj tej bitmapy, bo zabierasz kontrolce obrazek spod nosa. Dlatego się wywala.

0

Dzięki Azarien!
Teraz jest tak jak powinno być. Spróbowałem utworzyć bitmapę jak podałeś wcześniej: Bitmap bmp(pic1->Width,pic1->Height); ale przy tworzeniu Graphicsa z takiej bitmapy wywalało błąd. Przeczytałem teraz, że obiekty tworzone przez gcnew nie trzeba samemu usuwać stosując delete, gdyż robi to sam program.
Pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1