Gå til innhold

C#: Skalerings verdien til bildeskalering vil ikke bli regna ut!


Gjest Slettet-aNZFa3

Anbefalte innlegg

Gjest Slettet-aNZFa3

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 av Slettet-aNZFa3
Lenke til kommentar
Videoannonse
Annonse

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 av Wubbable
Lenke til kommentar
Gjest Slettet-aNZFa3

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 av Slettet-aNZFa3
Lenke til kommentar
Gjest Slettet-aNZFa3

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

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 av hockey500
Lenke til kommentar
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 av GeirGrusom
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...