This might be an odd question, but when I scale my image in C# I need it to be pixelated and not anti-aliased. Just like in MSpaint when you scale.
I hope images anti-alias by default in C#, or else I changed something I didn’t want to.
I’ve tried playing around with the Graphics.InterpolationMode but no luck there. I’m using a Bitmap object to hold the image and it’s being constructed like so:
// A custom control holds the image this.m_ZoomPanPicBox.Image = new Bitmap(szImagePath);
And a brief synapsis of the custom control:
class ZoomPanPicBox : ScrollableControl { Image m_image; float m_zoom = 1.0f; InterpolationMode m_interpolationMode; ... //////////////////////////////////////////////////////// public ZoomPanPicBox() { //Double buffer the control this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); this.AutoScroll=true; } //////////////////////////////////////////////////////// protected override void OnPaint(PaintEventArgs e) { //if no image, don't bother if(m_image==null) { base.OnPaintBackground(e); return; } //Set up a zoom matrix Matrix mx = new Matrix(m_zoom,0,0,m_zoom,0,0); //now translate the matrix into position for the scrollbars mx.Translate(this.AutoScrollPosition.X / m_zoom, this.AutoScrollPosition.Y / m_zoom); //use the transform e.Graphics.Transform = mx; //and the desired interpolation mode e.Graphics.InterpolationMode = m_interpolationMode; //Draw the image ignoring the images resolution settings. e.Graphics.DrawImage(m_image,new Rectangle(0,0,this.m_image.Width,this.m_image.Height),0,0,m_image.Width, m_image.Height,GraphicsUnit.Pixel); base.OnPaint(e); }
Any ideas? Thanks.
Actually, you’re right with InterpolationMode, as the docs say. Just set it to InterpolationMode.NearestNeighbor. In your code sample, you never set m_interpolationMode.