Avatar billede Slettet bruger
17. januar 2009 - 17:13 Der 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.

Link til Graf: http://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Body_mass_index_chart.svg/690px-Body_mass_index_chart.svg.png

På fårhånd tak
Terkel
Avatar billede driis Nybegynder
17. januar 2009 - 18:23 #1
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).
Avatar billede driis Nybegynder
17. januar 2009 - 19:25 #2
Her er et simpelt eksempel på hvad du vi gøre:
using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace dr.TestGraphics
{
    class Program
    {
        private const int height = 10;
        private const int width = 10;

        static void Main(string[] args)
        {
            string path = "./Resources/img.png";
            if (args.Length > 0)
                path = args[0];

            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);
               
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception occured");
                Console.WriteLine("{0} ({1})", ex.Message, ex.GetType().FullName);
                Console.WriteLine(ex.StackTrace);
            }
        }
    }
}


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".
Avatar billede Slettet bruger
18. januar 2009 - 16:21 #3
FANTASTISK Driis!
mange tak! - den virker perfekt
200 point til dig:)
Avatar billede 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.
Avatar billede Slettet bruger
18. januar 2009 - 17:14 #5
Troede lige det virkede.. Men der kommer desværre ingen Output.png
Ved ikke hvorfor
Avatar billede driis Nybegynder
18. januar 2009 - 17:41 #6
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 ?
Avatar billede 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
Avatar billede driis Nybegynder
18. januar 2009 - 19:59 #8
Målestokken skulle være nogenlunde til at gå til:

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).
Avatar billede 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?
Avatar billede driis Nybegynder
18. januar 2009 - 23:14 #10
Ja, selvfølgelig kan det bruges i en Form.

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).
Avatar billede 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
Avatar billede driis Nybegynder
19. januar 2009 - 22:36 #12
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.
Avatar billede 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.
Avatar billede 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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester