我使用StretchImage,因爲該框可以使用分隔線調整大小。它看起來像默認是某種平滑的雙線性過濾,導致我的圖像模糊,並有波紋圖案。如何使PictureBox使用最近鄰居重採樣?
17
A
回答
24
我需要這個功能也。我做了一個繼承PictureBox的類,覆蓋OnPaint
,並添加了一個屬性以允許插值模式被設置:
/// <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);
}
}
5
我懷疑你將不得不手動調整大小,通過Image類和DrawImage函數並響應PictureBox上的調整大小事件。
0
調整時在.NET中的形象,System.Drawing.Drawing2D.InterpolationMode提供了以下調整方法:
- 雙三次
- 雙線性
- 高
- HighQualityBicubic
- HighQualityBilinear
- 低
- NearestN eighbor
- 默認
+0
我不明白這是如何解決OP的問題。 – JYelton 2012-11-20 23:29:04
3
我做了MSDN搜索和原來有這個的文章,這是不是很詳細,但列出了你應該使用Paint事件。
http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx
我編輯了常用的圖像縮放例如要使用此功能,請參閱下面
從編輯:http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1
希望這有助於
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);
}
相關問題
- 1. 如何通過R最近鄰居求解最近鄰居?
- 2. 使用Quaternion的最近鄰居
- 3. 使用KDtree的最近鄰居
- 4. K-最近鄰居
- 5. 如何在Theano中進行快速的最近鄰居上採樣?
- 6. MongoDB如何找到最近的鄰居
- 7. 如何使用k-d樹找到最近的鄰居?
- 8. 如何使用Spatial.kdTree樹的point_id對象點的最近鄰居
- 9. 如何使用weka從命令行計算最近的鄰居?
- 10. 如何使用KDTrees實現最近鄰居搜索?
- 11. 存儲最近的鄰居
- 12. 最近鄰居算法
- 13. Excel宏最近鄰居
- 14. 最近鄰居2維
- 15. 查找K最近鄰居
- 16. JavaScript的最近鄰居庫
- 17. GDAL_Translate重採樣方法(最近?)
- 18. 使用openmp和分段錯誤的並行K最近鄰居
- 19. 使用K最近鄰居創建特徵
- 20. 使用「匹配」包的最近鄰居匹配
- 21. SKSpriteNode使用SKShader片段着色器的最近鄰居
- 22. 使用網格劃分的2D中的最近鄰居搜索
- 23. 在n個元素對象上使用最近鄰居搜索
- 24. 使用K-最近鄰居推測缺少值
- 25. 查找最近的鄰居/經度
- 26. 查找最近的鄰居 - OpenCV
- 27. 預測只有最近的鄰居值?
- 28. 圖像插值 - 最近鄰居(處理)
- 29. 優化scipy最近鄰居搜索
- 30. sklearn k最近鄰居問題
所以沒有實際的方法來做到這一點?在一些簡單的時尚? – Luiscencio 2010-10-25 20:18:01
@Luiscencio:這就是它的樣子。你必須自己做一個適當大小的新位圖,然後Graphics.DrawImage – 2010-10-25 21:33:55
你應該標記JYelton的答案。 :) – Pedro77 2013-05-30 22:28:20