07. juni 2003 - 09:23Der 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?
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.
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.
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å?
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...?
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.
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?
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.
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?
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
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.
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.
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?
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 ?
Jeg gav somaliomar 5 pts. da han har bidraget med links.
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.