Avatar billede el_fredo Praktikant
07. juni 2003 - 09:23 Der er 39 kommentarer og
2 løsninger

Ambiguous Reference

Det skal lige nævnes, at jeg arbejder i ASP.NET med C# som kodesprog.

Mit problem:
Jeg får x antal resultater fra en SQL-søgning. Det kan være 3, det kan være 25. Ud fra disse resultater skal jeg vise en form for graf. Da jeg ikke kender til en klasse eller metode der kan lave en graf for mig i ASP.NET eller C#, må jeg lave den selv, og havde tænkt på at gøre det med et simpelt Image, og så strække dens "Width" til den ønskede længde.

Da jeg som før nævnt ikke på forhånd ved hvor mange resultater (og dermed også Images) jeg får brug for, kan jeg ikke oprette dem manuelt fra starten. De skal oprettes dynamisk, og gennem koden placeres på min webform. Jeg kan dog ikke få lov til at lave et array af Images, eller i det hele taget få lov til i koden at oprette et objekt af klassen "Image", da det åbenbart er en "ambiguous reference".

Hvad gør jeg så?

Hvis der er mulighed for at "trække" på en eksisterende graf-klasse i C# eller ASP.NET så gør jeg helst det, men findes en sådan en??? Hvis ikke, hvordan laver jeg et dynamisk skærmbillede, der kan vise min graf?
Avatar billede somaliomar Praktikant
07. juni 2003 - 09:42 #1
Hvis du ved præcist hvordan dine billeder skal se ud, kan du starte her:
http://www.developerfusion.com/show/2569
Avatar billede burningice Nybegynder
07. juni 2003 - 11:02 #2
hvis du læste ordenligt efter i SDK'et, så vil du kunne se at Image-klassen er abstract, dvs. at man kan ikke oprette instanser af den. Du skal istedet bruge Bitmap, som du også vil kunne se i artiklen somaliomar har henvist til.
Avatar billede Lasse Novice
07. juni 2003 - 16:52 #3
Hej el_fredo

Du kan goere noget a la foelgende(pseudo kode):

System.Drawing.Bitmap bmp = new System.Drawing.Bitmap()

System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);

// Her kommer graf tegningen
g.DrawRectangle(....);
g.DrawLine(....);
// etc.

Idet du laver disse kald, skriver du direkte til bmp billedet.
Avatar billede el_fredo Praktikant
08. juni 2003 - 00:06 #4
Ok. Kanon. Så kan jeg jo lave et array af hhv. Bitmap og Graphics objekter... men hvordan placerer jeg dem dynamisk på min webform? Jeg ved jo ikke hvor mange jeg skal bruge endnu.

DrawRectangle... giver man den et koordinat??? Jeg er på vej i seng, så jeg kan ikke lige teste det nu. Det kunne jo være smart hvis man kunne gøre det.
Avatar billede el_fredo Praktikant
08. juni 2003 - 11:24 #5
Jeg får flg. fejl når jeg kører koden:

'System.Drawing.Bitmap.Bitmap()' is inaccessible due to its protection level

Jeg har derudover oprettet et "Pen" og et "Color" objekt, som skulle bruges i denne sammenhæng. Koden er i al dens pragt:

private void Page_Load(object sender, System.EventArgs e)
{
    Color color = System.Drawing.Color.Navy;
    Pen pen = new Pen(color);
    Bitmap bmp = new Bitmap();
    Graphics g = Graphics.FromImage(bmp);
    g.DrawRectangle(pen,200,200,150,4);
}

Men jeg får stadigvæk ovennævnte fejl (inaccessible due to prot. level). Hvad er der galt?
Avatar billede somaliomar Praktikant
08. juni 2003 - 12:15 #6
Bitmap contructoren skal have en eller flere parametre før det kan initialisere et objekt. Eks:

Bitmap bmp = new Bitmap(100,100); // Dimentioner billedet


Tjek det her http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDrawingBitmapClassctorTopic.asp
Avatar billede el_fredo Praktikant
08. juni 2003 - 13:18 #7
Jeg forstår ikke helt princippet... hvorfor skal man definere et bitmap til fx 100x100, og så derefter lave et Graphics objekt med den bitmap som indparameter, for til sidst at lave fx en rektangel...? Er der ikke en nemmere måde at lave en rektangel på?
Avatar billede burningice Nybegynder
08. juni 2003 - 20:24 #8
el_fredo>> Bitmap er selve billedet... Graphics er det object du skal bruge for at TEGNE på billedet med !!
Avatar billede burningice Nybegynder
08. juni 2003 - 20:25 #9
lidt ala

Bitmap = filen på din harddisk,
Graphics = Photoshop der åbner din fil og tegner i den
Avatar billede el_fredo Praktikant
09. juni 2003 - 10:10 #10
Ok. Fint nok, men kan du så ikke give mig et fungerende eksempel, som jeg kan bruge og udbygge i forb. m. ASP.NET applikationer...
Avatar billede el_fredo Praktikant
09. juni 2003 - 11:14 #11
Ok kan man i øvrigt dynamisk (i en løkke fx) oprette både Bitmap og Graphics objekter jvf. den problemstilling jeg fremførte tidligere, omkring det faktum, at jeg ikke på forhånd ved, hvor mange billeder/grafer jeg skal bruge...?
Avatar billede burningice Nybegynder
09. juni 2003 - 11:15 #12
et fungerende eksempel ?

//Opret billede
Bitmap b = new Bitmap(100, 100);

//Åbner det i Photoshop
Graphics g = Graphics.FromImage(b);

//Tegner på det
g.DrawString("hej med dig", new Font("Arial", 16), new SolidBrush(Color.Black), new Float(0, 0));

//Viser det til clienten
b.Save(Response.Stream, ImageFormat.Jpg);
Avatar billede burningice Nybegynder
09. juni 2003 - 11:20 #13
det kan du da sagtens... men istedet for at lave flere billeder... hvorfor laver du ikke bare et, men flere grafer på?

x = 100*antal søjler
y = 100

Bitmap b = new Bitmap(x, y);
Graphics g = Graphics.FromImage(b);

Color color = System.Drawing.Color.Navy;
Pen pen = new Pen(color);

for (int i = 0, i < antal søjler; i++ {
  g.DrawRectangle(pen, 200, 200+(20*i), 150, 4);
}

b.Save(Response.Stream, ImageFormat.Jpg);
Avatar billede el_fredo Praktikant
09. juni 2003 - 12:05 #14
Det er meget smart, at man laver en fil. Så er det så meningen, at jeg skal vise denne fil på min WebForm. Hvordan gør jeg det?
Avatar billede burningice Nybegynder
09. juni 2003 - 12:13 #15
der kan du enten save dit bitmap til en fil på webservernes harddisk og lave et <img> tag, der peger på det billede, eller du kan skrive det direkte ud til Response.Stream, som jeg har gjort det.
Avatar billede el_fredo Praktikant
09. juni 2003 - 12:16 #16
Ok, nu er jeg med. Jeg ændrer URL'en på et eksisterende billede til det billede jeg har genereret. Og så kan jeg lave et billede med tekst og filur og gejl. Kanon. Svarer du ikke lige en gang?
Avatar billede el_fredo Praktikant
09. juni 2003 - 12:17 #17
Iøvrigt, så kan jeg ikke få den der Response.Stream til at virke... Hvad gør den?
Avatar billede el_fredo Praktikant
09. juni 2003 - 12:17 #18
Og hvordan bruger du den?
Avatar billede burningice Nybegynder
09. juni 2003 - 12:26 #19
mybad... det hedder OutputStream

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpresponseclassoutputstreamtopic.asp

Det bruges til at skrive billedet ud til den strøm af data der går fra serveren og til klienten. På den måde kan man snyde klienten til at tro at en aspx-fil er en billede

Det du skal gøre er, at du laver en aspx-fil, og skriver din "grafgenerator"-kode i sidens page_load-event. På den side du skal bruge billedet på skriver du så

<img src="dinside.aspx">

Det kan så udvides med Querystrings og en masse if'er så billederne kan genereres mere dynamisk.
Avatar billede burningice Nybegynder
09. juni 2003 - 12:27 #20
som f.eks. den her side:

http://www.mdj.dk/imgc.aspx?id=33&x=700&y=500

der kan du selv vælge hvilket billede du vil se, og hvor stort det skal være
Avatar billede el_fredo Praktikant
09. juni 2003 - 12:41 #21
Og du mener ikke, at et genereret billede med grafer kommer til at fylde for meget --> tage for lang tid at loade... Hvis man gemmer billedet som .jpg, laver den så automatisk komprimering?
Avatar billede burningice Nybegynder
09. juni 2003 - 12:59 #22
hvis din grafer ikke er dynamiske, så er det da klart smartest bare at gemme dem ned på harddisken en gang og læse dem derfra... Ud fra teksten til dit spm, så ved du jo ikke hvordan din graf skal se ud på forhånd, og derfor er det hurtigts at lave den onthefly, og gemme billedet i Response.OutputStream istedet for på harddisken, som klienten så skal til at læse fra bagefter.

Ang. komprimering, så er det jo netop derfor at jeg skriver ImageFormat.Jpg, netop for at drage nytte af jpg-komprimering. Hvis din graf kun er sorhvid kan du med fordel bruge ImageFormat.Gif istedet
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:00 #23
Jeg kan ikke loade de billeder jeg gemmer. Der kommer et rødt kryds i øveste venstre hjørne af billedet. Hvis jeg åbner billedet i et redigeringsprogram, kan jeg se, at mit .jpg billede har transparent baggrund, og vælger jeg "Save", så får jeg besked om, at filformatet ikke understøtter transparency. Siger jeg ok, så gemmer den i samme navn (stadig .jpg) men nu kan programmet godt vise filen. Er det måden jeg gemmer filen på, der er forkert? Den gemmer i hvert tilfælde ikke som korrekt .jpg fil.
Avatar billede burningice Nybegynder
09. juni 2003 - 13:05 #24
hvordan gemmer du dit billede ?
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:21 #25
bmp = new Bitmap(300,300);
gfx = Graphics.FromImage(bmp);
color = System.Drawing.Color.Navy;
pen = new Pen(color);

i=0;
while (i<10)
{
    gfx.DrawRectangle(pen, 20, (20+(20*i)), (20*i), 4);
    ++i;
}
bmp.Save(@"C:\Graph.jpg");
imgGraph.ImageURL = @"C:\Graph.jpg";
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:23 #26
Det virker heller ikke, hvis jeg i Visual Studio hardkoder ImageURL'en ind. Den viser stadigvæk rødt kryds, INDTIL jeg åbner og gemmer billedet i fx MS Photo Editor, og vælger at overskrive det gamle.
Avatar billede burningice Nybegynder
09. juni 2003 - 13:25 #27
prøv at sæt et imageformat på !!!
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:30 #28
Hvordan sætter jeg formatet på den???
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:30 #29
Jeg har fundet System.Drawing.Imaging.Encoder, men hvordan sætter jeg den til fx jpg?
Avatar billede burningice Nybegynder
09. juni 2003 - 13:37 #30
nånej, jeg har jo ikke prøve at skære det ud i pap, og SDK'et gør det i hvert fald heller ikke

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdrawingimageclasssavetopic3.asp

bmp.Save(@"C:\Graph.jpg", ImageFormat.Jpeg);
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:40 #31
Jep. 1000 tak. Jeg fandt faktisk også lige selv ud af det med ImageFormat... :o) Kan du ikke lige svare? Så du kan få nogle pts.?
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:41 #32
Det kan godt være, at jeg lige spørger dig omkring Response.OutputStream, hvis det er i orden...
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:41 #33
Hvordan sætter man i øvrigt baggrundsfarven på sit billede??? Den er sort nu.
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:45 #34
Ah, jeg bruger bare
gfx.Clear(Color.White);
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:47 #35
Lige en sidste ting. Nu bliver jpg billeder jo nemt kornede. Kan man undgå det nu her i C#? Hvis et billede kun består af 3 farver, og ellers er rimeligt simpelt, så kan det jo pakkes meget ned, uden at man mister informationer om billedet. Fx et .zip pakket BMP billede... kan man gøre sådan, at man mister færrest muligt antal informationer omkring billedet?
Avatar billede burningice Nybegynder
09. juni 2003 - 13:51 #36
uhm... hvis det kun består af tre farver, så er ImageFormat.Gif vel bedst, da Gif jo består af maks 256 farver, mens af Jpeg består af 16 millioner ?

Jeg er ikke nogen grafik-nørd, så jeg ved ikke så meget om det... jeg bruger dog selv noget biliniær filtering som en fyr på CodeProject har lavet.. jeg ved ikke om det er noget af det du søger? Det er forresten en super fed gennemgang af GDI+ han har lavet, så det kunne være du skulle læse den igennem ?

http://www.codeproject.com/cs/media/imageprocessing4.asp
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:53 #37
Nåja for satan! Gif. Der går jo ingen data tabt... Kan du ikke lige svare, så du kan få nogle point?
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:53 #38
Ja, nu ser det sq pænt ud. Ingen grynede kanter... yiiiir.
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:54 #39
Og kun 1,84KB for et 500*500 billede :)
Avatar billede burningice Nybegynder
09. juni 2003 - 13:56 #40
:) det var jo godt
Avatar billede el_fredo Praktikant
09. juni 2003 - 13:57 #41
Jeg gav somaliomar 5 pts. da han har bidraget med links.
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