Pregunta

Estoy tratando de cambiar el tamaño de una imagen en .NET, pero obtenga una frontera negra débil alrededor de la imagen de cambio de tamaño.Encontré un post - HTTP: //social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/cf765094-c8c1-4991-a1f3-cdbd07eee11/ que de alguien que dijo que hacía el rectángulo de destino más grande que el lienzo trabajado,Pero esto no funciona para mí.Se vuelve ridículas de las fronteras superior e izquierda, pero la derecha y la parte inferior siguen ahí, y son un negro de 1px de espesor completo.

¿Estoy perdiendo algo?Mi código está abajo.

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);
        }

¿Fue útil?

Solución

Pruébelo así, creo que nunca he recibido una frontera negra ...

Si desea utilizar las bibliotecas de System.Drawing:

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);
      }
    }
}

O puede hacer lo mismo con WPF, como este:

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);
}

Recomiendo el WPF Way.La compresión y la calidad parecen mejor ...

Otros consejos

Simplemente proporcione el método DRAWIMAGE con una instancia de ImageAlTributs que tiene WrapMode establecido en Tileflipxy.Esto evitará que el borde se mezclará contra el color de fondo.

Para el código de muestra que no fugan la memoria como las otras respuestas aquí, Vea este gist

para mí fue un parámetro malo de mapa de bits.En lugar de esto:

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

Simplemente retire el Pixelformat a esto:

new Bitmap(width, height);

y todo estaba bien entonces.

Con el Pixelformat, tuve frontera negra en la frontera superior e izquierda.Luego probé g.pixeloffsetmode= pixeloffsetmode.highquality;Lo que parecía bien al principio.Pero luego noté fronteras grises claras alrededor de toda la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top