J'ai besoin que mon image redimensionnée soit aliasée en C #
Question
C’est peut-être une question étrange, mais lorsque j’échelle mon image en C #, j’ai besoin qu’elle soit pixélisée et non anti-aliasée. Comme dans MSpaint lorsque vous redimensionnez.
J'espère que les images sont anti-alias par défaut en C #, sinon j'ai changé quelque chose que je ne voulais pas.
J'ai essayé de jouer avec le Graphics.InterpolationMode
mais sans succès. J'utilise un objet Bitmap pour contenir l'image et elle est construite comme suit:
// A custom control holds the image
this.m_ZoomPanPicBox.Image = new Bitmap(szImagePath);
Et une brève synthèse du contrôle personnalisé:
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);
}
Des idées? Merci.
La solution
En fait, vous avez raison avec InterpolationMode, en tant que la documentation indique . Il suffit de le définir sur InterpolationMode.NearestNeighbor. Dans votre exemple de code, vous ne définissez jamais m_interpolationMode.
Autres conseils
Eh bien, vous pouvez implémenter la balance vous-même et faire une interpolation linéaire simple (par exemple, ne faites pas de moyenne de voisin comme une bicubique) ... Celles-ci ont l’air sympa et blocées.