2015-02-14 20 views
6

Tôi đang sử dụng JCrop để cắt Image. Nó hoạt động tốt nếu tôi hiển thị Hình ảnh thực tế cho người dùng. Tuy nhiên, nếu tôi hiển thị Thay đổi kích thước Image thay vì Thực tế Image thì tôi đang nhận được Co-ordinates của Thay đổi kích thước Image.

Sau đó, Làm cách nào để Cắt Image dựa trên nó? Ở đây, tôi đang đi qua đường dẫn Image đã lưu Image.

Tóm lại, nếu kích thước Đã lưu Image nếu ví dụ: 715 * 350 thì tôi sẽ hiển thị nó trong cửa sổ bật lên ở Kích thước nhỏ dựa trên CSS. Vì vậy, tôi sẽ nhận được Co-ordinates của Kích thước nhỏ Image. và tôi đang áp dụng các số Co-ordinates trên Main Image.

Mã của tôi:Xảy ra sự cố hình ảnh khi không hiển thị Hình ảnh thực tế bằng C#

using (System.Drawing.Image OriginalImage = System.Drawing.Image.FromFile(Img)) 
      { 
       using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(Width, Height)) 
       { 
        bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution); 

        using (System.Drawing.Graphics Graphic = System.Drawing.Graphics.FromImage(bmp)) 
        { 
         Graphic.SmoothingMode = SmoothingMode.AntiAlias; 
         Graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 
         Graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; 
         Graphic.DrawImage(OriginalImage, new System.Drawing.Rectangle(0, 0, Width, Height), X, Y, Width, Height, System.Drawing.GraphicsUnit.Pixel); 

         MemoryStream ms = new MemoryStream(); 
         bmp.Save(ms, OriginalImage.RawFormat); 

         ms.Close(); 
         ms.Flush(); 
         ms.Dispose(); 

         return ms.GetBuffer(); 
        } 
       } 
      } 

Trả lời

5

Mã bạn hiển thị được thực hiện cho thay đổi kích thước, cắt xén không cho (Trong Graphic.DrawImage() cuộc gọi, bạn không quan tâm đến các tọa độ cắt xén, và chỉ cần áp dụng một Width điểm đến/Chiều cao)

Để cắt ảnh, bạn chỉ có thể sử dụng phương thức Bitmap.Clone(). Chỉ cần chuyển đến tọa độ cắt xén mà bạn đã trích xuất từ ​​JCrop. (cropzone trong ví dụ sau)

public static async Task CropImage() 
{ 
    var client = new WebClient(); 
    var sourceimg = new Uri(@"http://logonoid.com/images/stack-overflow-logo.png"); 
    var destination = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), "logoCropped.png")); 
    if (destination.Exists) 
     destination.Delete(); 
    using (Stream sourceStream = await client.OpenReadTaskAsync(sourceimg)) 
    { 
     using (Bitmap source = new Bitmap(sourceStream)) 
     { 
      Rectangle cropzone = new Rectangle(0, 0, 256, 256); 
      using (Bitmap croppedBitmap = source.Clone(cropzone, source.PixelFormat)) 
      { 
       croppedBitmap.Save(destination.FullName, ImageFormat.Png); 
      } 
     } 
    } 
} 

Một số lời khuyên về mã của bạn:

  • Khi chỉ cắt xén, không có hoạt động thay đổi kích thước liên quan. Vì vậy, các thông số SmoothingMode, InterpolationMode, PixelOffsetMode vô dụng tại đây.
  • Giới thiệu về MemoryStream, bạn nên sử dụng nó trong tuyên bố using. Nó tránh các cuộc gọi thủ công tới Close()Dispose() và bảo đảm chúng được gọi là bất kỳ điều gì xảy ra. Và về phương pháp Flush(), nó just does nothing trên lớp MemoryStream.
Các vấn đề liên quan