2012-11-12 3 views
0

Je rencontre des problèmes lors de l'utilisation de WPF pour redimensionner des images, dans la mesure où les images sont floues à certaines résolutions. Je suis en train d'écrire ces fichiers dans les fichiers, donc SnapToDevicePixels ne va pas aider (je ne suis même pas dans une application WPF, je ne fais référence à System.Windows). Je comprends que cela est lié à l'indépendance des pixels de l'appareil dans WPF, mais j'ai maintenant besoin de savoir comment je peux calculer le décalage des pixels de telle sorte que j'obtiens des images nettes.Formule pour déterminer le décalage correct pour les images redimensionnées wpf

Répondre

0

Est-il nécessaire d'utiliser WPF? Ce code à base GDI que nous utilisons produit d'excellents pouvoirs Redimensionnement:

public static Size ResizeImage(
     string fileName, 
     string targetFileName, 
     Size boundingSize, 
     string targetMimeType, 
     long quality) 
    { 
     ImageCodecInfo imageCodecInfo = 
      ImageCodecInfo 
       .GetImageEncoders() 
       .Single(i => i.MimeType == targetMimeType); 
     EncoderParameters encoderParams = new EncoderParameters(1); 
     encoderParams.Param[0] = 
      new EncoderParameter(Encoder.Quality, quality); 
     using (FileStream fs = File.OpenRead(fileName)) 
     { 
      Image img ; 
      try 
      { 
       img = Image.FromStream(fs, true, true); 
      } 
      catch (ArgumentException ex) 
      { 
       throw new FileFormatException("cannot decode image",ex); 
      } 
      using (img) 
      { 
       double targetAspectRatio = 
        ((double)boundingSize.Width)/boundingSize.Height; 
       double srcAspectRatio = ((double)img.Width)/img.Height; 
       int targetWidth = boundingSize.Width; 
       int targetHeight = boundingSize.Height; 
       if (srcAspectRatio > targetAspectRatio) 
       { 
        double h = targetWidth/srcAspectRatio; 
        targetHeight = Convert.ToInt32(Math.Round(h)); 
       } 
       else 
       { 
        double w = targetHeight * srcAspectRatio; 
        targetWidth = Convert.ToInt32(Math.Round(w)); 
       } 
       using (Image thumbNail = new Bitmap(targetWidth, targetHeight)) 
       using (Graphics g = Graphics.FromImage(thumbNail)) 
       { 
        g.CompositingQuality = CompositingQuality.HighQuality; 
        g.SmoothingMode = SmoothingMode.HighQuality; 
        g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
        g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
        Rectangle rect = 
         new Rectangle(0, 0, targetWidth, targetHeight); 
        g.DrawImage(img, rect); 
        thumbNail.Save(
         targetFileName, imageCodecInfo, encoderParams); 
       } 
       return new Size(targetWidth, targetHeight); 
      } 

     } 
    } 
+0

GDI est le repli, mais nous avons rencontré des problèmes qui nécessitaient beaucoup de verrouillage pour se déplacer dans le passé, et selon les étiquettes sur la boîte, WPF est censé être plus rapide pour ce genre de chose. Nous avons déjà utilisé WPF pendant un certain temps, et nous avons déjà atteint la plupart des problèmes de démarrage que nous verrons à l'échelle. Cela peut sembler comme un coût submergé, mais cela semble être un problème mineur avec ce qui, je l'espère, sera une solution isolée simple, ce qui signifie que je n'ai pas besoin de réécrire une grande partie d'une solution existante. – Khanzor

Questions connexes