Hogyan mentsem egy vezérlő (Panel) képét Bitmap-be? (Visual C#)
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:
"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()
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
É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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!