views:

100

answers:

3
int newWidth = 100;
int newHeight = 100;
double ratio = 0;

if (img1.Width > img1.Height)
{
    ratio = img1.Width / img1.Height;
    newHeight = (int)(newHeight / ratio);
}
else
{
    ratio = img1.Height / img1.Width;
    newWidth = (int)(newWidth / ratio);
}

Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
bmp1.Save(Server.MapPath("~/Uploads/Photos/Thumbnails/") + photo.PhotoID + ".jpg");

I always get Image with both height and width having same values (100)
I am obiously doing something wrong with type conversion?

+2  A: 

You can say:

ratio = img1.Width / (img1.Height * 1.0);

To ensure that the value of the result is not truncated due to integer arithmetic.

Justin Ethier
Personally, I think casting (ala @Anthony's answer) makes the intent more clear.
JeffH
A: 

What is the size of the images? if the width and height are always equal then this would make sense.

newWidth = (int)(newWidth / ratio);  // this is newWidth = newWidth / 1 so it doesn't change.
galford13x
height and width are not the same. I test both horizontal and vertical photos
ile
+12  A: 
ratio = img1.Width / img1.Height;

Width and Height are integers. You will be performing integer math on these values before storing them in your double. In integer math, 150 / 100 is 1. 199 / 100 is 1. 101 / 100 is 1. There are no decimals. After the value has been calculated, then it will be stored in your double.

Cast at least one side to double before doing your calculation.

ratio = img1.Width / (double)img1.Height;
Anthony Pegram
Hmmm... now I tried to upload new photo with dimensions width=800 and height=533 and thumbnail is newWidth=800 and newHeight=66
ile
@ile, I don't see where that would happen in your code snippet. Are you setting newWidth = img.Width anywhere that's not visible above? Because you shouldn't. newWidth, from your snippet, should remain 100.
Anthony Pegram
upvoted this is actually covered in one of the ms press books I went through for my foundation exam, definately need to cast one of the figures (I usually do the divisor) to double to avoid loss of precision.
krystan honour
Can you step through the code with the debugger and see when the newWidth changes to 800?
galford13x
Anthony, you were right! I left newWidth = img.Width below if statement and forgot to remove it. Thanks!
ile