17. januar 2009 - 17:13Der er
13 kommentarer og 1 løsning
Grafik i C#
Hej Jeg er ved at programmere et lille simpelt program, som udregner folks BMI (Body Mass Index). For dem som ikke ved det, er BMI en formel som fortæller om man er undervægtig, overvægtig eller bare helt normal.
Problemet er bare det at når mit program har udregnet BMI'en vil jeg gerne have dem sætter en lille prik på en graf jeg har fundet på nettet (se link i bunden). Prikken skal gerne symbolisere hvor brugeren ca ligger, ud fra hans/hendes bmi. Grafen er et simpelt .png billede.
Du kan loade billedet ind i et System.Drawing.Bitmap objekt. Dernæst kan du udfra det få et Graphics objekt, som du kan bruge til at tegne på dit billede (Graphics.FromImage metoden).
try { Bitmap bitmap = new Bitmap(path); Brush brush = new SolidBrush(Color.Navy); using(Graphics g = Graphics.FromImage(bitmap)) { int x = (bitmap.Width - width)/2; int y = (bitmap.Height - height)/2; g.FillEllipse(brush,x,y,width,height); } bitmap.Save("output.png", ImageFormat.Png);
Du skal naturligvis måle på billedet og finde ud af hvor x og y aksen begynder, og hvor mange pixels et kilo og cm. højde svarer til. Når du har gjort det, kan du med fornuftig nøjagtighed beregne koordinatet, hvor du skal placere "prikken".
Synes godt om
Slettet bruger
18. januar 2009 - 16:21#3
FANTASTISK Driis! mange tak! - den virker perfekt 200 point til dig:)
Synes godt om
Slettet bruger
18. januar 2009 - 17:11#4
Kan ikke få den til at lave output.png. Har også tænkt lidt over hvad den første if sætning gør.
Synes godt om
Slettet bruger
18. januar 2009 - 17:14#5
Troede lige det virkede.. Men der kommer desværre ingen Output.png Ved ikke hvorfor
Den første if - siger, hvis du compiler som console program så skal den læse billedet ind som ligger i første argument til programmet. Ellers skal den forsøge sig med den test-sti jeg har skrevet ind. Billedet skal selvfølgelig eksistere.
Hvis ikke den skriver at der kommer nogen fejl (det er det jeg gør i catch blokken hvis noget går galt); burde output.png være blevet skrevet. Da jeg ikke sætter nogen sti på, gemmer den i current working directory. Hvis du har det som et visual studio project, kan du finde output.png i bin/Debug folderen.
OK ?
Synes godt om
Slettet bruger
18. januar 2009 - 18:32#7
Har fået det til at virke:) Det er bare et kæmpe arbejde at udregne hvor mange pixels de forskellige målestok er. Kan ikke rigtig finde en ordenlig formel. Tak
Du måler højde og bredd, i pixels, af den del af billedet, der udgør grafen. Det dividerer med spændet af den enhed du vil bruge som input. F.eks. ved kg; der er et spænd på 120 kg. Hvis grafen f.eks. er 600 pix (har ikke målt !); er det så 5 pixel/kg. Desuden skal du måle, hvor langt inde i selve billedet grafen starter, så du har et nulpunkt at starte på. Så er det bare (nulpunkt offset) + (antal kg * 5 pixel/kg).
Samme fremgangsmåde med y-koordinaterne; blot husk at på skærmen ligger nulpunktet i øverste venstre hjørne (ikke i nederste venstre hjørne som på et traditionelt koordinatsystem).
Synes godt om
Slettet bruger
18. januar 2009 - 22:12#9
Tak :) jeg vil prøve at regne på det. Jeg var selv kommet frem til at resultatet skulle være start punktet + en formel som konvertere fx 59 kg til pixels som passer til grafen. Har husket det med y-koordinaterne, og har også fundet start punktet på grafen.
Ps: Det script du har skrevet er lavet til Console Applications, men er det muligt at bruge det sammen med en windows form, hvor jeg også viser output.png til brugeren?
Du kan f.eks. have en PictureBox hvor du sætter Image til at være din Bitmap efter du har tegnet på den.
Så, essentielt samme kode som jeg har skrevet, og så f.eks. i stedet for at køre Save: pictureBox.Image = bitmap;
(Så skal du selvfølgelig have en PictureBox med navnet "pictureBox" på formen for at det virker).
Synes godt om
Slettet bruger
19. januar 2009 - 21:23#11
Det virker ganske godt! Grafen er desværre 592 px bred. Det vil sige at det bliver et decimal tal. Er det muligt på en eller anden måde at bruge en double i stedet for en int?
Fx (592px / 120 kg) = 4.9. ved godt det er minimalt, men bare så jeg ved det en anden gang:) Tak
Du kan jo bare gemme de 4.9 som en double og så gange det ud med antal kg, før du afrunder. Så har du max. 1 pixel afvigelse fra hvor prikken "burde være", og grafens opløsning taget i betragtning kan du ikke gøre det bedre.
Hvis du gemmer det som heltal 5, begår du jo en fejl på 0.1 pix per kilo, med andre ord sætter du prikken 12 pixel forkert ved 120 kg.
Synes godt om
Slettet bruger
20. januar 2009 - 18:35#13
Det kunne vel være bedst hvis man lavede en ny Graf? Man kan ikke lave sådan grafer i excel, men det må jeg finde ud af. (tror måske Photoshop cs4 kan gøre det)
men man skal jo også tage højde for de sorte linjer på 2px? Fordi ved hvert 10kg kommer en sort linje(border) og det hele skudt 2px, så ved 20 kg 4px osv.
Synes godt om
Slettet bruger
21. januar 2009 - 00:53#14
Super nu virker vægten, men kan ikke for højden til at virke? (den er i meter)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.