Gjest Slettet-aNZFa3 Skrevet 11. februar 2009 Del Skrevet 11. februar 2009 (endret) Det jeg prøver å er å skalere et bilde, slik at det ikke er noe som stikker utafor kantene. Men problemet er når jeg prøver å regne ut verdien som bildet skal skaleres etter så vil den ikke bli regna ut, jeg har sjekka i debugginga, og der blir den bare 0.0 uansett, selv jeg skriver inn talla manuelt. Her er koden: //Den nye høyden bildet skal få: float _height = 0f; //Selveste utregningen if (img.Height > this.Height) { float _temp = this.Height / img.Height; //Her kommer problemet _height = img.Height * _temp; } else _height = img.Height; if (img.Width > this.Width) { float _temp = (float)(this.Width / img.Width); //Det samme problemet her _width = img.Width * _temp; } else _width = img.Width; e.Graphics.DrawImage(img, 0, 0, _width, _height); Koden funker flott på bilder som er mindre enn selveste kontrollen. Jeg har også sjekka koden matematisk og den blir fint regna ut for hånd (med kalkulator). Endret 11. februar 2009 av Slettet-aNZFa3 Lenke til kommentar
Wubbable Skrevet 11. februar 2009 Del Skrevet 11. februar 2009 (endret) Må du ikke resize bildet? Mulig jeg tar feil, men DrawImage tegner bildet slik det er, men den tegner ikke mer enn de målene du oppgir... Si at formen din er 5x5px, og bildet er 10x10px... Tegner du det bildet med DrawImage(img,0,0,5,5), tegnes kun den første firkanten (5x5) av bildet (Total 4 stykk 5x5 firkanter, altså 10x10 til sammen)... Endret 11. februar 2009 av Wubbable Lenke til kommentar
Gjest Slettet-aNZFa3 Skrevet 11. februar 2009 Del Skrevet 11. februar 2009 (endret) Jeg tror faktisk du har rett! Men det forklarer fortsatt ikke hvorfor "_temp" variablen ikke vil bli regna ut. Da kan jeg bruke "_height" og "_width" variablene til å skalere bildet på den rette måten da. Endret 11. februar 2009 av Slettet-aNZFa3 Lenke til kommentar
MrEspen Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 Bare en kjapp gjetning, men tror kanskje du må konvertere Height fra int til float før du regner ut, altså: float _temp = (float) this.Heigth / (float) img.Height; Istedetfor: float _temp = this.Height / img.Height; Lenke til kommentar
Gjest Slettet-aNZFa3 Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 Selvfølgelig! At jeg ikke tenkte på det, skal prøve det etterpå. Lenke til kommentar
Wubbable Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 Det har ingenting å si... double a = 5 / 8; double b = 5.0 / 8.0; a == b Lenke til kommentar
Gjest Slettet-aNZFa3 Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 Prøvde det nå, fortsatt det samme, blir ikke regna ut. Jeg begynner å bli frustrert her, siden det er tydeligvis en logisk feil jeg ikke finner. Lenke til kommentar
hockey500 Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 (endret) Wubbable: hvordan forklarer du da dette? double a = 5 / 8; double b = 5.0 / 8.0; Console.WriteLine("a: {0}\nb: {1}\na == b ({2})", a, b, a == b); output: a: 0 b: 0,625 a == b (False) EDIT: og jeg ser ikke noe galt med koden til trådstarter, men jeg vet hvertfall at denne funker (og er betraktelig kortere): SizeF canvas = new SizeF(1024, 768); SizeF pict = new SizeF(100, 400); float ratio = ((pict.Width / pict.Height) > (canvas.Width / canvas.Height)) ? canvas.Width / pict.Width : canvas.Height / pict.Height; multipliser ratio med bildestørrelsen, så har du den nye størrelsen. Endret 20. februar 2009 av hockey500 Lenke til kommentar
GeirGrusom Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 (endret) Det har ingenting å si... double a = 5 / 8; double b = 5.0 / 8.0; a == b Nei: a != b Og her er beviset og grunnen int ia = 5, ib = 8; double da = 5.0, db = 8.0; double a = ia / ib; double b = da / db; blir til assemblykode (x86): ; double a = ia / ib; mov eax,dword ptr [ebp-3Ch] cdq idiv eax,dword ptr [ebp-40h]; Heltall signert divisjon mov dword ptr [ebp-68h],eax fild dword ptr [ebp-68h]; Laster inn i FPU-en fstp qword ptr [ebp-58h]; Lagrer verdien i 'a' ; double b = da / db; fld qword ptr [ebp-48h] fdiv qword ptr [ebp-50h]; Flyttallsdivisjon fstp qword ptr [ebp-60h] Så du må konvertere minst en av verdiene til float for å få riktig verdi ut. Endret 20. februar 2009 av GeirGrusom Lenke til kommentar
Wubbable Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 Det ble 0,625 i VB.NET uansett Noen grunn til det? Lenke til kommentar
GeirGrusom Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 Ja C# og VB er svært forskjellig på dette området når det gjelder datatype konvertering. Utifra konteksten kunne en antatt at utvikleren var interessert i en flyttallsdivisjon, men uttrykket som er skrevet inn er en heltallsdivisjon. Skal du gjøre en eksplisitt heltallsdivisjon i VB mener jeg at en skal bruke '\' istedetfor '/' for å override denne oppførselen, mens C# utfører det akkurat som det står. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå