Domanda

Sto cercando di ridimensionare un'immagine in .NET, ma ottenere un debole confine nero attorno all'immagine ridimensionata.Ho trovato un post - http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/Thread/cf765094-C8C1-4991-A1F3-CECDBD07EF3-CECDBD07EE15/ Quale da qualcuno che ha detto che recupera il rettangolo di destinazione più grande della tela,Ma questo non funziona per me.Ottiene riid del top e dei bordi sinistro, ma il diritto e il fondo sono ancora lì, e sono un nero pieno di 1 px.

Sono percorsi qualcosa?Il mio codice è sotto.

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

È stato utile?

Soluzione

Provalo come questo, penso di non aver mai avuto un bordo nero ...

Se si desidera utilizzare System.Drawing Libraries:

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 puoi fare lo stesso con WPF, come questo:

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

Raccomando il wpf way.La compressione e la qualità sembrano migliori ...

Altri suggerimenti

È sufficiente fornire il metodo del drawimage con un'istanza di immagini che ha un wrapmode impostato su tileflipxy.Ciò impedirà al bordo della miscelazione contro il colore di sfondo.

Per il codice di esempio che non perde memoria come le altre risposte qui, Vedi questo GIST

.

Per me è stato un brutto parametro bitmap.Invece di questo:

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

Basta rimuovere il pixelformat a questo:

new Bitmap(width, height);
.

E tutto era ok allora.

Con il pixelformat avevo confine nero sulla parte superiore e il bordo sinistro.Poi ho provato G.PixeloffSetMode= PixeloffSetMode.Highquality;che sembrava per primo.Ma poi ho notato bordi grigio chiaro attorno all'intera immagine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top