2010-12-26 15 views
6

新しいASP.Net MVC 3 Html Helper WebImageを使用して、アップロードしたファイルを四角形に切り抜く方法を知っている人はいませんか?可能であれば、それを中心にしたいと思っています。私はこれを理解しようとしている最後の数時間、私の頭を叩いています...どんな助けもありがとう!WebImageスクエアを切り抜く

シナリオはかなりシンプルで、ユーザーは画像をアップロードできます。画像はその後、四角形にリサイズされ、後でサイトのサムネイルとして使用されます。

+0

いくつかの素晴らしい例がここにあります - http://weblogs.asp.net/gunnarpeipman/archive/2010/10/15/asp-net-mvc-3-beta-simple-image-manipulations-using- webimage-helper.aspx –

+0

@ダン・アトキンソン - ええ、私はそれらの例を見ましたが、私の問題は四角形に切り取っています(そして中心化しようとしています)。 –

答えて

13

これは私のために働いた、希望は他の人のためにいくつかの時間を節約...!

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

Jquery image crop pluginを使用することをお勧めします。私は画像の主要部分を削除することができるので、自動的に四角い切り抜きをするのは良くないと思うので、例えばユーザーの写真の場合は頭を刈ることができます。

画像クロッププラグインは使いやすいです。ユーザーは、彼がプレビューとして使用することを選択するだけです。サーバー側では、始点座標と幅/高さを受け取ります。サーバー側の画像のサイズ変更/クロップの場合は、image magickを使用します。 wrapper for image magick at .netがあります。 32ビットのみなのでラッパーも気にしてください。私は自分のニーズのためにイメージmagickのラッパーを開発しました。しかし、私はそれが簡単にネットで行うことができると信じています。

あなたがまだ必要としていると思うのであれば、イメージの最大センタースクエアを切り抜いて、必要なサイズにサイズ変更することをお勧めします。

このヘルプが必要です。

P.S.私は知らないが、私はそのようなタスクは、MVC WebImageを使用して行うことはできませんと思います。

+0

+1はJcropに言及しています。 http://code.google.com/p/jcrop/ –

+0

ありがとう、私はjcropを見てきましたが、私はできるだけシームレスにこれをしようとしています。私は切り抜きが意図しない切り抜きを引き起こす可能性があることを認識していますが、中心に置かれていればほとんどの時間は働きます。 –

3

ここでは、画像を中央から切り取って、必要な比率を維持する少しの機能があります。ギャラリーなどの画像を切り取るために使用します。

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; 
    } 
関連する問題