Avatar billede burningice Nybegynder
21. juli 2004 - 18:14 Der er 27 kommentarer og
1 løsning

Generering af billede ud fra et gif-billede og "tegn-selv"

Jeg skal have genereret et billede hvor jeg loader en trøje ind og tegner på lidt på den før at jeg streamer det ud til klienten.

Trøjen jeg loader ind er et gif-billede, så det der skal streames ud er selvfølgelig også af formatet gif.

Det trælse er nu, at når jeg tegner på billedet bliver det utrolig dårlig kvalitet når det streames til klienten. Hvis jeg kører samme køre, bare uden at tegne på billedet (altså at loade det og streame det til klienten), så fejler kvaliteten ikke nogen.

Er der noget specielt med opløsninger o.lign. jeg skal tage højde for?


Lidt gennemgang af koden:

//Loade billedet
Bitmap imgLogo = (Bitmap)Bitmap.FromFile(RequestHelper.Logo.ThumbnailPath);
            Bitmap imgMain;
           
            try
            {
                imgMain = (Bitmap)Bitmap.FromFile(imagePath);
            }
            catch (FileNotFoundException)
            {
                imgMain = new Bitmap(300, 472);
                Graphics gr = Graphics.FromImage(imgMain);
                gr.DrawString("File not found", new Font(FontFamily.GenericSerif, 20, FontStyle.Bold), Brushes.Red, new Point(75, 200), StringFormat.GenericDefault);
                imgMain.Save(Response.OutputStream, ImageFormat.Gif);
                return;
            }
           
            Graphics g;

            try
            {
                g = Graphics.FromImage(imgMain);
            }
            catch
            {
                Bitmap tmp = new Bitmap(imgMain.Width, imgMain.Height);
               
                g = Graphics.FromImage(tmp);
                g.FillRectangle(Brushes.Transparent, 0, 0, tmp.Width, tmp.Height);
                g.DrawImage(imgMain, new Rectangle(0, 0, tmp.Width, tmp.Height), 0, 0, tmp.Width, tmp.Height, GraphicsUnit.Pixel);
               
                imgMain = tmp;
            }

//Tegn på billedet
Point newPoint = new Point(p.X+(s.Width/2-25/2), p.Y+(s.Height/2-25/2));
                g.DrawEllipse(Pens.Black, newPoint.X, newPoint.Y, 25, 25);
                g.DrawString("Her", new System.Drawing.Font(FontFamily.GenericSerif, 9, FontStyle.Bold), Brushes.Black, new Point(newPoint.X+1, newPoint.Y+5));

//Gem til klient
imgMain.Save(Response.OutputStream, ImageFormat.Gif);
Avatar billede snepnet Nybegynder
21. juli 2004 - 18:29 #1
Der er noget der hedder SmoothingMode på Graphics - Det skulle du gerne kunne styre nogle forhold omkring kvaliteten med.
Avatar billede snepnet Nybegynder
21. juli 2004 - 18:30 #2
Modes enum ligger her :
System.Drawing.Drawing2D.SmoothingMode
Avatar billede burningice Nybegynder
21. juli 2004 - 23:44 #3
nu har jeg leget med det en del efterhånden, og det bliver ved med at drille...

det er ikke det jeg tegner på billedet der bliver grimt. Det er hele billedet, det er helt grovkornet :(

Prøv at se den her, den skulle gerne være helt "glat" i farven, og ikke så grovkornet.

http://projekter.mpaconsult.dk/dobedogz.com/new/imagegenerator.aspx/?productId=51&logocat=Geometric&logoname=gm1008&productColor=104&x=147&y=237

(user: dobedogz, pass: hemmeligt)
Avatar billede burningice Nybegynder
21. juli 2004 - 23:46 #4
og så har jeg også et andet problem... hele den sorte farve på billedet burde være gennemsigtigt... det burde kunne lade sig gøre med denne kode:

g = Graphics.FromImage(tmp);
g.FillRectangle(Brushes.Transparent, 0, 0, tmp.Width, tmp.Height);
g.DrawImage(imgMain, new Rectangle(0, 0, tmp.Width, tmp.Height), 0, 0, tmp.Width, tmp.Height, GraphicsUnit.Pixel);


er det mig der er gal på den, eller er der bare nogle finurligheder med gdi+ man lige skal have styr på?
Avatar billede snepnet Nybegynder
21. juli 2004 - 23:46 #5
jeg kommer ikke ind...har du et navn på orglet jeg kan skrive foran dobedogz ?
Avatar billede snepnet Nybegynder
21. juli 2004 - 23:55 #6
Jeg smider lige din kode ind her... Havde du et navn på maskinen ?
Avatar billede snepnet Nybegynder
22. juli 2004 - 00:24 #7
Det havde du så ikke :o)
Men bortset fra det tror den måde at lave transparens holder... Jeg tror du skal lave noget tmp.MakeTransParent(enellerandenfarve);
Avatar billede snepnet Nybegynder
22. juli 2004 - 00:46 #8
Er du smuttet ?
Avatar billede burningice Nybegynder
22. juli 2004 - 04:56 #9
hey... sorry, var på vej iseng... skulle tidligt op igen :)

ja, det er mig der har dummet mig, user er dobedogz.com
Avatar billede burningice Nybegynder
22. juli 2004 - 05:10 #10
jeg har prøvet det med MateTransparent, men det laver samme nummer... det der skulle være transparent bliver bare sort :( hvis jeg fylder med farven Cyan, bliver baggrunden rigtig nok Cyan. Når jeg så bruger tmp.MakeTransparent(Colors.Cyan), så bliver det bare sort igen :(
Avatar billede snepnet Nybegynder
22. juli 2004 - 11:11 #11
Hej cyberfessor - ufatteligt ondt tidspunkt du stod op på der :o)

For at øge kvaliteten, kig her :
http://dotnetjunkies.com/WebLog/bsblog/archive/2004/01/26/6103.aspx

Med hensyn til det med den transperante/sorte baggrund, så er du bestemt ikke alene :
http://www.dotnet247.com/247reference/msgs/7/36972.aspx
(her regner de med at det er en bug i gdi+)

Og.... så kan du muligvis bruge noget af det her :
http://www.dotnet247.com/247reference/msgs/8/43997.aspx

Kan du ikke lægge en ImageRef.aspx eller lignende ud med det originale billede ?
Avatar billede snepnet Nybegynder
22. juli 2004 - 11:35 #12
Det er faktisk rigtig trist... Det her virkes f.eks. helt fint :

    Bitmap b = new Bitmap("somegif.gif");   
    b.MakeTransparent(Color.Red);
    b.Save(@"C:\TestFiles\giffeliffer.gif");

giffeliffer.gif er som forventet, og jeg kan også bruge det i en winform :

    (e er et PaintEventArgs)
    e.Graphics.DrawImage(b,10,10, b.Width, b.Height);

Der virker det også fint, men når jeg laver en

    b.Save(Response.OutputStream, ImageFormat.Gif);

Kommer den sorte baggrund frem.
Avatar billede burningice Nybegynder
22. juli 2004 - 12:26 #13
ja... det er et lidt ondt tidspunkt ;)

som du kan se, så har jeg fået kvaliteten på billedet til at være ok nu. Jeg endte valgte at gemme som png istedet (b.Save(Response.OutputStream, ImageFormat.Png);), og vupti, så kom det fineste billede frem.

Jeg håbede også at det med transarency også ville virke, men ak nej :( Har fundet en KB-article omkring at ændre på farvepaletten i et billede, men jeg må godt nok indrømme, at jeg fatter kegle af det. Jeg havde fået opfattelsen af, at det kun var med gif-billeder at der var problemer på grund af noget licens-gejl, men jeg kan altså heller ikke få det til at virke med png.
Avatar billede snepnet Nybegynder
22. juli 2004 - 12:33 #14
Virker det heller ikke hvis du bare gemmer på disk ?
Denne her virker ellers ok her :

    Bitmap b = new Bitmap("somegif.gif");   
    b.MakeTransparent(Color.Red);
    b.Save(@"C:\TestFiles\giffeliffer.gif");

Hmmm... Synes egentlig ikke jeg kan se nogen forskel på billedet ?!? Der er stadig nogle "klamme kanter", men jeg har heller ikke set originalen :o)

Har du prøvet den her :
http://dotnetjunkies.com/WebLog/bsblog/archive/2004/01/26/6103.aspx
Avatar billede burningice Nybegynder
22. juli 2004 - 12:38 #15
snepnet>> kvaliteten af billedet er ok nu, da jeg gemmer som png...

virker det også at gemme på disk hvis at du også tegner lidt på billedet før du gemmer den?
Avatar billede snepnet Nybegynder
22. juli 2004 - 12:43 #16
Prøver lige.
Avatar billede snepnet Nybegynder
22. juli 2004 - 12:47 #17
Ja det ser ikke ud til at gøre nogen forskel....
Vil du have billedet, så du kan prøve det ?
(du kan både få en photoshop-fil, og den producerede gif. Jeg tror det har en noget at sige hvordan dit "grundbillede" er lavet).
Avatar billede snepnet Nybegynder
22. juli 2004 - 12:48 #18
Har du evt. en uploadfunktionalitet på det site du henviste til ?
Avatar billede burningice Nybegynder
22. juli 2004 - 12:51 #19
for satan da... nu har jeg prøvet at smide den Quanti-et_eller_andet på, og sørme om der ikke ser underværker. Allerede da jeg kiggede på sourcen til den, kunne jeg se at han havde gang i noget med billedets palette og Alpha-channel, og det var lige præcis det at KB-articlen fra MS omhandlede. Så bevar mig vel om jeg ikke fik lidt kriller i maven og fik fat på med at teste det ;)

http://projekter.mpaconsult.dk/dobedogz.com/new/productdesigner.aspx?productId=38&logoCat=Rigtige%20mænd&logoName=mz3025h&productSize=S&productColor=1

sådan skal det være... (siden er beregnet til en popup, så det er bevidst den ser lidt underlig ud ;)) se hele siden her: http://projekter.mpaconsult.dk/dobedogz.com/new
Avatar billede burningice Nybegynder
22. juli 2004 - 12:53 #20
kan du lave en Graphics-object ud fra dit billede uden den brokker sig? Det kan jeg nemlig ikke, og jeg tror det er der den går gal. Jeg får en fejl ala "cannot create graphics-object from indexed picture", og det er derfor jeg bliver nødt til at have denne try-catch:

Graphics g;

            try
            {
                g = Graphics.FromImage(imgMain);
            }
            catch
            {
                Bitmap tmp = new Bitmap(imgMain.Width, imgMain.Height);
                g = Graphics.FromImage(tmp);
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                                               
                g.DrawImage(imgMain, 0, 0);
               
                imgMain = tmp;
            }
Avatar billede snepnet Nybegynder
22. juli 2004 - 13:14 #21
Ahhh... nu ser det jo lækkert ud !!! - Fedt :o)

Mht fejlen så er det et spørgsmål om pixelformat - du kan se noget om det her, hvor der også er angivet hvilket PixelFormat's der udløser fejlen :

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

Et umiddelbart workaround er self. at holde sig fra de formater når man laver billedet, men man kan jo muligvis trixe det i koden også (måske ved at oprette et nyt billede med det rigtig pixelformat, og så smide det originale billede der... Jeg har ikke prøvet det, men mon ikke det kan lade sig gøre).

Har du for øvrigt set den her :
http://www.bobpowell.net/gdiplus_faq.htm
Den er vildt grim, men der er nogle meget gode eksempler mv.

Og.... Her er en rigtig god en der forklarer lidt om kvantisering :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/colorquant.asp
(den ser faktisk rigtig interessant ud)
Avatar billede burningice Nybegynder
22. juli 2004 - 13:26 #22
ja... problemet er bare, at jeg får alle billederne direkte fra kunden, og vores grafiker har allerede tæsket 405 stykker igennem for at farvelægge dem, så jeg tror ikke lige han har lyst til at skulle igennem dem allesammen igen for at gemme dem i det rigtige pixel-format. Næsten gang de skal have en tur, og han er blevet lidt bedre til scripting i PhotoShop, bliver de nok konverteret til .png ;)
Avatar billede snepnet Nybegynder
22. juli 2004 - 13:32 #23
Tsk tsk... grafikere :o)
Avatar billede snepnet Nybegynder
22. juli 2004 - 13:33 #24
De burde da pr. automatik sikre sig kompatabilitet med gængse GDI+ kald.... Hvad er det dog for en verden vi lever i :o)
Avatar billede snepnet Nybegynder
08. august 2004 - 17:36 #25
cyberfessor... kan vi lukke her på en eller anden måde ?
Avatar billede burningice Nybegynder
16. august 2004 - 11:02 #26
jeps, så er jeg tilbage på pinden... du må meget undskylde ventetiden, men der har været en del at se til i forbindelse med at jeg skal flytte til ålborg for at læse Datalogi.

ja, dine links viste sig at være helt uundverlige, og nu virker det bare som det skal :) tak for det... så hvis du lige smider et svar :)
Avatar billede snepnet Nybegynder
16. august 2004 - 11:25 #27
Hej cyberfessor - hyggeligt at høre fra dig igen :o)
Avatar billede burningice Nybegynder
16. august 2004 - 14:14 #28
I lige måde :) nu hvor tingene er ved at falde lidt til ro kunne det være jeg kom lidt mere på eksperten igen ;)
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