[C#] Animated Gif resizen *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
Hallo,

Ik ben bezig met het proberen om een (animated) image te verkleinen/vergroten volgens een variabele waarde. (Het gaat niet altijd om een animated image daarom de "ImageAnimator.CanAnimate") Voor zover google me kon vertellen moest ik eerst alle frames afzonderlijk bewerken. Dit heb ik ook gedaan in de onderstaande code. Nu krijg ik echter enkel de laatste frame te zien.

Nu vermoed ik dat dit komt doordat ik men "newImage" een bitmap toewijs en deze geen meerdere frames bevat en ik eigenlijk een image moet hebben met evenveel frames erin als de oorspronkelijke image. Of kan het zijn dat ik dit volledig mis zie? Indien dit het geval is zou ik mij een image moeten kunnen toewijzen die de juiste afmetingen heeft en de nodige aantal frames heeft.

Iemand een idee wat het probleem kan zijn? Mogelijks een oplossing? Of werkt het niet op deze manier en moet ik het over een andere boeg gooien?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private Image GetReseizedPicture(int width, int height, Image currentImage)
        {
            if (ImageAnimator.CanAnimate(currentImage))
            {
                Image newImage = new Bitmap(width, height, currentImage.PixelFormat);

                FrameDimension dimension = new FrameDimension(currentImage.FrameDimensionsList[0]);
                int frameCount = currentImage.GetFrameCount(dimension);

                for (int i = 0; i < frameCount; i++)
                {
                    currentImage.SelectActiveFrame(dimension, i);

                    using (Graphics g = Graphics.FromImage(newImage))
                    {
                        g.CompositingQuality = CompositingQuality.HighQuality;
                        g.SmoothingMode = SmoothingMode.HighQuality;
                        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                        Rectangle oRectangle = new Rectangle(0, 0, width, height);

                        g.DrawImage(currentImage, oRectangle);
                    }
                }

                return newImage;
            }
            else
            {
                Image newImage = new Bitmap(width, height, currentImage.PixelFormat);

                using (Graphics g = Graphics.FromImage(newImage))
                {
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                    Rectangle oRectangle = new Rectangle(0, 0, width, height);

                    g.DrawImage(currentImage, oRectangle);
                }
                return newImage;
            }
        }

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sorry, ben even te druk verder te kijken, maar GetReseizedPicture moet natuurlijk GetResizedPicture zijn ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
@RobIII, in de titel staat het ook verkeerd ;)

Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Het probleem is inderdaad dat je niet een Bitmap aanmaakt die meerdere frames heeft. Je selecteert in je for-loop wel iedere keer het volgende frame uit currentImage, maar niet in newImage, waardoor je dus telkens dezelfde frame overschrijft.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
Sorry voor de schrijfwijze van resize, lag wat te dromen blijkbaar deze morgen :X

Probeerde net 2 dingen uit:

C#:
1
2
currentImage.SelectActiveFrame(dimension, i); 
newImage.SelectActiveFrame(dimension, i); 


Wat niet werkte natuurlijk aangezien er maar 1 frame in de bitmap zit.

C#:
1
2
3
if (ImageAnimator.CanAnimate(currentImage)) 
            { 
                Image newImage = currentImage;


Nu krijg ik wel men animatie te zien maar men image wordt niet meer mee geresized.
Dacht dat men oplossing dicht bij de waarheid lag maar blijkbaar ben ik er toch nog ver vanaf.