Kezdőoldal » Számítástechnika » Programozás » Hogyan mentsem egy vezérlő...

Hogyan mentsem egy vezérlő (Panel) képét Bitmap-be? (Visual C#)

Figyelt kérdés

Eddig a következő sorokkal próbálkoztam.

private void mentésToolStripMenuItem_Click(object sender, EventArgs e)

{

Bitmap bm = new Bitmap(1920, 1080);

panel1.DrawToBitmap(bm, new Rectangle(0, 0, 1920, 1080));

bm.Save("Test.jpg", ImageFormat.Jpeg);


}


A panelra DrawLine függvénnyel rajzolok, de folyton csak az üres sima (rajzolatlan) panel képét menti a Bitmap-be. Utánanéztem számtalan helyen, és mindenhol azt írták, hogy így lehet egy panel képét rögzíteni fájlba. Próbálkoztam Panel helyett PictureBox vezérlővel, és ott is pontosan ugyan ez a probléma. Az eredmény folyton egy a bitmap-al egyenlő felbontású, panel színével megegyező egyszínű JPEG kép.

A form teljes kódlapja itt tekinthetők meg:


[link]



2013. júl. 6. 21:33
 1/6 anonim ***** válasza:

"Bitmap bm = new Bitmap(1920, 1080);" helyett szerintem

"Bitmap bm = new Bitmap(panel1.Width, panel1.Height);"


Minden rajzolás után: "panel1.Refresh();"


"BasePoint = panel1.PointToClient(Cursor.Position);"

Nem kell PointToClient-et használni ha a panel mouse eseményeit használod tehát az esemény "EventArgs"-a az egér panel beli X Y kordinátáját tartalmazza.


PictureBox-al jobb lenne, mert akkor:

Graphics g = Graphics.FromImage(pictureBox1.Image);

Mentés: pictureBox1.Image.Save(...)


Rajzolás:

g.DrawLine(...)

pictureBox1.Refresh()

2013. júl. 7. 14:30
Hasznos számodra ez a válasz?
 2/6 A kérdező kommentje:

Graphics g = Graphics.FromImage(pictureBox1.Image);-re

ArgumentNullException-t dob


A panel1.Refresh(); utasításra kiürül a panel teljes tartalma, az eredmény megint egy sima kép a rajzolatlan panelről. Ha rajzolás után rakom be így értelemszerűen eltűnteti amit rajzol.


Az első tanácsod meg is fogadtam. Biztonságos megoldás. :)


Nagyon nagyon sokat segítene a megoldás, mert ez lenne a kulcsa annak, hogy görgetéskor ne vesszen el, ami kiesik éppen az ablakból, nyilván a képanyag fájlba mentése, és a műveletek visszavonását is mentéssel szeretném megoldani.


Egyébként a projekt célja egy olyan alkalmazás lenne, amivel egy panel-ra (vagy pictureBox-ra) több felhasználó rajzolhat egy időben, interneten keresztül, így közösen megoldva pl egy matekfeladatot. Kutattam korábban ilyen alkalmazások után, de egyet se találtam, ezért gondoltam, hogy én csinálok egyet. Ha esetleg tud valaki ilyen alkalmazást, az megemlíthetné.


Előre is köszönöm a segítséget.


Hátha segít a megoldásban feltöltöm a teljes solution-t .zip-ben


[link]

2013. júl. 7. 16:04
 3/6 SimkoL ***** válasza:
Bár nem értek a C#-hoz, de Delphi-ben Canvas amire rajzolunk. Szerintem C#-ben is van :)
2013. júl. 7. 20:38
Hasznos számodra ez a válasz?
 4/6 A kérdező kommentje:
C#-ban Panel és PictureBox van helyette.
2013. júl. 7. 21:39
 5/6 anonim ***** válasza:

Érdekes feladat :D


NullException: Elfelejtettem hogy a pictureBox.Image null alapból tehát:

pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox2.Height);


PictureBox-ba rajzolás így GDI-vel nem túl gyors, ezért kellene csinálni egy saját UserControl-t ami egy PixtureBox módosulata (class BlaBla : UserControl...) és az ctor-ba bettenni ezt:

SetStyle(ControlStyles.DoubleBuffer, true);

Ezzel gyorsabb lesz a rajzolás.


Ha neten kell mennie akkor miért nem csinálod TCP-vel?

Szóval amikor vki rajzol azt minden kliensnek elküldi így mindenki ugyanazt láthatja..


És mint mondtam (írtam :D) érdekes feladat főleg amiatt hogy ezt neten keresztül kéne megoldani.

TCP-re tudsz példát találni, de ha kell akkor szerintem egy kisebb prototípust is tudnék csinálni, ha kell.


Összesítve: Tényleg Canvas kéne bár nincs, ezért kell DoubleBuffer-elt PictureBox. Nem kell elmenteni és betöltögetni fájlokat h mindenki lássa a "munkát" hanem TCP-vel neten szinkronizálni kéne mindent.

2013. júl. 8. 15:18
Hasznos számodra ez a válasz?
 6/6 A kérdező kommentje:
Igen én is úgy gondoltam, hogy neten lesz szinkronizálva, csak először az offline paint-et akartam megcsinálni, és később bővíteni TCP-vel. Mert ezelőtt még Paint-et se csináltam. A fájlba mentés meg csak arra kéne, hogy ha valami miatt félbe kell szakítani a munkát később lehessen folytatni. Az ötleted nekem már kicsit magas szóval megköszönném, ha tudnál csinálni egy prototípust a double bufferről és TCP-meg még teljesen új világ, úgyhogy abba se ártana egy példa hogy megértsem. Arról meg már nem is beszélve, hogy életemben nem írtam még UserControl-t. Bár nagyon érdekel a téma, mert nem szeretek alap kontrollokhoz kötve lenni.
2013. júl. 8. 22:52

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!