Question

J'essaie de redimensionner une image dans .NET, mais j'ai une frontière noire faible autour de l'image redimensionnée. J'ai trouvé un post - http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/cf765094-c8c1-4991-a1f3-cecdbd07ee15/ qui de quelqu'un qui a dit que la renforce du rectangle de destination était plus grande que la toile fonctionnait, mais cela ne fonctionne pas pour moi. Il obtient des bordures supérieures et gauche, mais la droite et le bas sont toujours là, et sont un noir complet de 1 pixe d'épaisseur.

Est-ce que je manque quelque chose? Mon code est ci-dessous.

Image image = ... // this is a valid image loaded from the source
Rectangle srcRectangle = new Rectangle(0,0,width, height);
        Size croppedFullSize = new Size(width+3,height+3);
        Rectangle destRect = new Rectangle(new Point(-1,-1), croppedFullSize);
        using(Bitmap newImage = new Bitmap(croppedFullSize.Width, croppedFullSize.Height, format))
        using(Graphics Canvas = Graphics.FromImage(newImage)) {
            Canvas.SmoothingMode = SmoothingMode.AntiAlias;
            Canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
            Canvas.FillRectangle(Brushes.Transparent, destRect);
            Canvas.DrawImage(image, destRect, srcRectangle, GraphicsUnit.Pixel);


            newImage.Save(filename, image.RawFormat);
        }
Était-ce utile?

La solution

Essayez-le comme ça, je pense que je n'ai jamais de bordure noire ...

Si vous souhaitez utiliser System.

using (var sourceBmp = new Bitmap(sourcePath))
{
  decimal aspect = (decimal)sourceBmp.Width / (decimal)sourceBmp.Height;
  int newHeight = (int)(newWidth / aspect);

   using (var destinationBmp = new Bitmap(newWidth, newHeight))
   {
     using (var destinationGfx = Graphics.FromImage(destinationBmp))
     {
       destinationGfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
       destinationGfx.DrawImage(sourceBmp, new Rectangle(0, 0, destinationBmp.Width, destinationBmp.Height));
       destinationBmp.Save(destinationPath, ImageFormat.Jpeg);
      }
    }
}

Ou vous pouvez faire de même avec WPF, comme ceci:

using (var output = new FileStream(outputPath, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None))
{
   var imageDecoder = BitmapDecoder.Create(inputStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
   var imageFrame = imageDecoder.Frames[0];

   decimal aspect = (decimal)imageFrame.Width / (decimal)imageFrame.Height;
   var height = (int)(newWidth / aspect);

   var imageResized = new TransformedBitmap(imageFrame,new ScaleTransform(
                                                                 newWidth / imageFrame.Width * Dpi / imageFrame.DpiX,
                                                                 height / imageFrame.Height * Dpi / imageFrame.DpiY, 0, 0));

   var targetFrame = BitmapFrame.Create(imageResized);

   var targetEncoder = new JpegBitmapEncoder();
   targetEncoder.Frames.Add(targetFrame);
   targetEncoder.QualityLevel = 80;
   targetEncoder.Save(output);
}

Je recommande le WPF Way. La compression et la qualité semble mieux ...

Autres conseils

Fournissez simplement la méthode DrawImage avec une instance d'imageatRributes qui a un wrapMode défini sur Tileflipxy. Cela empêchera le bord de se fondre contre la couleur de fond.

Pour un exemple de code qui ne fuit pas de mémoire comme les autres réponses ici, Voir ce gist

Pour moi, c'était un mauvais paramètre bitmap. Au lieu de cela:

new Bitmap(width, height, PixelFormat.Format32bppPArgb);

Retirez simplement le pixelformat à ceci:

new Bitmap(width, height);

Et tout allait bien alors.

Avec le Pixelformat, j'avais une bordure noire sur le dessus et la bordure gauche. Ensuite, j'ai essayé g.PixelOffSetMode = PixelOffSetMode.Highquality; Ce qui semblait bien au début. Mais ensuite j'ai remarqué des bordures gris clair autour de l'image entière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top