2008-08-26 31 views
17

Tôi đang sử dụng StretchImage vì hộp có thể thay đổi kích thước bằng bộ tách. Dường như mặc định là một số loại lọc song tuyến trơn tru, làm cho hình ảnh của tôi bị mờ và có các kiểu moire.Làm cách nào để tạo một PictureBox sử dụng tính năng lấy lại vùng lân cận gần nhất?

+1

vì vậy không có cách thực tế để làm điều này? trong một số thời trang dễ dàng? – Luiscencio

+0

@Luiscencio: đó là hình thức của nó. Bạn sẽ phải tự mình làm với một Bitmap mới có kích thước phù hợp và sau đó là Graphics.DrawImage –

+0

Bạn nên đánh dấu câu trả lời của JYelton. :) – Pedro77

Trả lời

24

tôi cần chức năng này cũng thế. Tôi đã tạo một lớp kế thừa PictureBox, ghi đè OnPaint và thêm thuộc tính để cho phép đặt chế độ nội suy:

/// <summary> 
/// Inherits from PictureBox; adds Interpolation Mode Setting 
/// </summary> 
public class PictureBoxWithInterpolationMode : PictureBox 
{ 
    public InterpolationMode InterpolationMode { get; set; } 

    protected override void OnPaint(PaintEventArgs paintEventArgs) 
    { 
     paintEventArgs.Graphics.InterpolationMode = InterpolationMode; 
     base.OnPaint(paintEventArgs); 
    } 
} 
+0

Rất đẹp. Tôi nghĩ PanAndZoomPictureBox của EmguCV cũng vậy. Bạn có biết bất kỳ vấn đề hiệu suất nào đang thực hiện nó không? – Pedro77

+0

Tôi chưa có bất kỳ sự khác biệt về hiệu suất có thể đo lường nào thay đổi chế độ nội suy theo cách này. – JYelton

+0

Humm tốt. Jared Updike nên đánh dấu câu trả lời của bạn! :) – Pedro77

5

Tôi nghi ngờ bạn sẽ phải thực hiện thay đổi kích thước theo cách thủ công thông qua lớp Image và chức năng DrawImage và trả lời các sự kiện thay đổi kích thước trên PictureBox.

0

Khi thay đổi kích thước một hình ảnh trong .net, các System.Drawing.Drawing2D.InterpolationMode cung cấp các phương pháp thay đổi kích thước sau:

  • Bicubic
  • Bilinear
  • cao
  • HighQualityBicubic
  • HighQualityBilinear
  • Thấp
  • Gần nhấtN eighbor
  • Mặc định
+0

Tôi không thấy cách này giải quyết câu hỏi của OP. – JYelton

3

tôi đã tìm kiếm MSDN và hóa ra đó là một bài viết về vấn đề này, mà không phải là rất chi tiết nhưng vạch ra rằng bạn nên sử dụng sự kiện sơn.

http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx

tôi sửa một hình ảnh thường có sẵn phóng to ví dụ để sử dụng tính năng này, xem dưới đây

Sửa từ: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1

Hope this helps

private void Form1_Load(object sender, EventArgs e) 
    { 
     // set image location 
     imgOriginal = new Bitmap(Image.FromFile(@"C:\images\TestImage.bmp")); 
     picBox.Image = imgOriginal; 

     // set Picture Box Attributes 
     picBox.SizeMode = PictureBoxSizeMode.StretchImage; 

     // set Slider Attributes 
     zoomSlider.Minimum = 1; 
     zoomSlider.Maximum = 5; 
     zoomSlider.SmallChange = 1; 
     zoomSlider.LargeChange = 1; 
     zoomSlider.UseWaitCursor = false; 

     SetPictureBoxSize(); 

     // reduce flickering 
     this.DoubleBuffered = true; 
    } 

    // picturebox size changed triggers paint event 
    private void SetPictureBoxSize() 
    { 
     Size s = new Size(Convert.ToInt32(imgOriginal.Width * zoomSlider.Value), Convert.ToInt32(imgOriginal.Height * zoomSlider.Value)); 
     picBox.Size = s; 
    } 


    // looks for user trackbar changes 
    private void trackBar1_Scroll(object sender, EventArgs e) 
    { 
     if (zoomSlider.Value > 0) 
     { 
      SetPictureBoxSize(); 
     } 
    } 

    // redraws image using nearest neighbour resampling 
    private void picBox_Paint_1(object sender, PaintEventArgs e) 
    { 
     e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; 
     e.Graphics.DrawImage(
      imgOriginal, 
      new Rectangle(0, 0, picBox.Width, picBox.Height), 
      // destination rectangle 
      0, 
      0,   // upper-left corner of source rectangle 
      imgOriginal.Width,  // width of source rectangle 
      imgOriginal.Height,  // height of source rectangle 
      GraphicsUnit.Pixel); 
    } 
+0

Sự kiện nào được kết nối với phương pháp picBox_Paint_1 của bạn? nó sẽ ở trong một số phần khác của mã của bạn. –

+0

Vâng, đó là mã mẫu thiết kế: this.picBox.Paint + = new System.Windows.Forms.PaintEventHandler (this.picBox_Paint_1); – ardunn

Các vấn đề liên quan