2012-01-29 2 views
0

Так что я просто немного кода, который повторно размеров мои изображения профиля, как они потребляются, проблема есть, # код C не работает так, как я ожидал ...C# Image Resize Math Issue

Вот бит кода внутри метода действий контроллера для индекса View, где я это делаю ...

string fullFileName = HttpContext.Server.MapPath(profile.ProfilePhotoPath); 
    System.Drawing.Image img = System.Drawing.Image.FromFile(fullFileName); 
    int width = img.Width; 
    int height = img.Height; 

    float reductionPercentage = 0F; 

    if (width >= height) 
    { 
     reductionPercentage = (282/width); 
    } 
    if (width < height) 
    { 
     reductionPercentage = (337/height); 
    } 

    int newWidth = (int)Math.Round(width * reductionPercentage); 
    int newHeight = (int)Math.Round(height * reductionPercentage); 

    ViewBag.newWidth = newWidth; 
    ViewBag.newHeight = newHeight; 

Каждая часть этого работает отлично, за исключением того, когда он попадает в «reductionPercentage = *»

Если изображение меньше или s ame размер, сокращениеPercentage делает точно так, как он должен, и присваивать значение 1 сокращению Percentage, однако, если изображение больше, это похоже на то, что он вообще не выполняет математику, он всегда выплевывает 0 в качестве значения для сокращения. Percentage ...

Любые идеи, что я могу сделать неправильно?

+1

Это не имеет никакого отношения к MVC. – Oded

ответ

5

(282/width) и (337/height) являются integer division - когда знаменатель больше числителя, вы получите 0 в результате.

Сделайте одним из участников разделения поплавок, чтобы обеспечить деление с плавающей запятой.

if (width >= height) 
{ 
    reductionPercentage = (282f/width); 
} 
if (width < height) 
{ 
    reductionPercentage = (337f/height); 
} 
+0

Этот код не компилируется; '282.0' и' 337.0' являются 'double' литералами и не могут быть неявно преобразованы в' float'. –

+0

Совершенно верно, @MichaelLiu - спасибо за исправление. – Oded

+0

Есть ли какая-нибудь причина использовать float в этот день и в возрасте? –

2

Поскольку 282, 337, width и height все целые числа, оператор / выполняет целочисленное деление, усечения любую дробную часть результата. Используйте 282f и 337f вместо того, чтобы:

if (width >= height) 
{ 
    reductionPercentage = 282f/width; 
} 
else 
{ 
    reductionPercentage = 337f/height; 
} 

The f суффикс сигналы о том, что число является float вместо int, так что выполняется с плавающей точкой деления.