2010-12-26 10 views
6

Czy ktoś wie, jak używać nowego programu ASP.Net MVC 3 Html Helper WebImage do przycinania przesłanego pliku do kwadratu. Chciałbym go wyśrodkować, jeśli to możliwe. Przez ostatnie kilka godzin waliłem w głowę, próbując to zrozumieć ... każda pomoc jest doceniana!Przycinanie programu WebImage do kwadratu

Scenariusz jest dość prosty, użytkownik może przesłać obraz, obrazek zostanie następnie przeskalowany do kwadratu, który będzie później używany jako miniatura na stronie.

+0

Jest kilka ciekawych przykładów tutaj - http://weblogs.asp.net/gunnarpeipman/archive/2010/10/15/asp-net-mvc-3-beta-simple-image-manipulations-using- webimage-helper.aspx –

+0

@Dan Atkinson - tak, widziałem te przykłady, ale moim problemem jest przycinanie do kwadratu (i próby centrum). –

Odpowiedz

13

To zadziałało dla mnie, nadzieja oszczędza trochę czasu dla innych ...!

private static void CropImage (HttpPostedFileBase sourceImage) { 
    var newImage = new WebImage(sourceImage.InputStream); 

    var width = newImage.Width; 
    var height = newImage.Height; 

    if (width > height) { 
    var leftRightCrop = (width - height)/2; 
    newImage.Crop(0, leftRightCrop, 0, leftRightCrop); 
    } 
    else if (height > width) { 
    var topBottomCrop = (height - width)/2; 
    newImage.Crop(topBottomCrop, 0, topBottomCrop, 0); 
    } 

    //do something with cropped image... 
    //newImage.GetBytes(); 
} 
3

Proponuję użyć Jquery image crop plugin. Ponieważ myślę, że nie dobrze przycinać kwadrat automatycznie, ponieważ można usunąć główną część obrazu, na przykład, jeśli zdjęcie użytkownika można przyciąć głowę.

Wtyczka do przycinania obrazów jest łatwa w użyciu. Użytkownik po prostu wybierz, że chce używać jako podglądu. Po stronie serwera otrzymujesz współrzędne punktu początkowego i szerokość/wysokość. W celu zmiany rozmiaru obrazu/przycięcia po stronie serwera używam image magick. Jest wrapper for image magick at .net. Należy również zachować ostrożność przy opakowaniu, ponieważ jest to tylko 32-bitowe. Opracowałem dla moich potrzeb własne opakowanie dla magii obrazu. Ale wierzę, że można to łatwo zrobić za pomocą .net.

Jeśli nadal uważasz, że autopropping jest tym, czego potrzebujesz, proponuję przyciąć maksymalnie środek kwadratu obrazu, a następnie powrócić do rozmiaru, który chcesz.

Mam nadzieję, że ta pomoc.

P.S. Nie wiem, ale przypuszczam, że takie zadanie nie może być wykonane przy użyciu mvc WebImage.

+0

+1 za wzmiankę o Jcrop. http://code.google.com/p/jcrop/ –

+0

dziękuję, zajrzałem do jcrop, ale staram się, aby było to tak płynne, jak to tylko możliwe. Zdaję sobie sprawę, że przycinanie może spowodować pewne niezamierzone przycięcie, ale będzie działało przez większość czasu, jeśli jest wyśrodkowane. –

3

Oto mała funkcja, która przycina obraz z centrum, ale zachowując pożądany stosunek. Używam go do kadrowania zdjęć w galeriach itp.

public static WebImage BestUsabilityCrop(WebImage image, decimal targetRatio) 
    { 
     decimal currentImageRatio = image.Width/(decimal) image.Height; 
     int difference; 

     //image is wider than targeted 
     if (currentImageRatio > targetRatio) 
     { 
      int targetWidth = Convert.ToInt32(Math.Floor(targetRatio * image.Height)); 
      difference = image.Width - targetWidth; 
      int left = Convert.ToInt32(Math.Floor(difference/(decimal) 2)); 
      int right = Convert.ToInt32(Math.Ceiling(difference/(decimal) 2)); 
      image.Crop(0, left, 0, right); 
     } 
     //image is higher than targeted 
     else if (currentImageRatio < targetRatio) 
     { 
      int targetHeight = Convert.ToInt32(Math.Floor(image.Width/targetRatio)); 
      difference = image.Height - targetHeight; 
      int top = Convert.ToInt32(Math.Floor(difference/(decimal) 2)); 
      int bottom = Convert.ToInt32(Math.Ceiling(difference/(decimal) 2)); 
      image.Crop(top, 0, bottom, 0); 
     } 
     return image; 
    }