2011-12-28 3 views
1

Je construis un album photo pour mon portfolio de photographies. Mais je me questionne sur ce qui suit:Miniatures et album photo

Dois-je sauvegarder la version miniature sur le système de fichiers sur le serveur, ou dois-je générer dynamiquement la vignette lorsque l'image miniature est demandée?

Je suppose que les avantages pour stocker la vignette, est moins de traitement sur le serveur, car il a généré le fichier une fois (lorsque le fichier est téléchargé). Mais le contre serait que si je décide un jour que les vignettes sont de la mauvaise taille, j'ai un problème. Aussi, je stocke 2 fichiers maintenant (Thumb plus original).

Ensuite, y a-t-il une taille optimale pour les vignettes? Je suppose que la réponse est - quelle taille voulez-vous les vignettes stockées. Mon problème est que mes onglets sont en train d'être redimensionnés à 150 ou 150 maximum. Cependant, les fichiers atteignent environ 40 Ko.

J'utilise ceci:

public void ResizeImage(string originalFile, string newFile, int newWidth, int maxHeight, bool onlyResizeIfWider) 
    { 
     System.Drawing.Image fullsizeImage = System.Drawing.Image.FromFile(MapPath(GlobalVariables.UploadPath + "/" + originalFile)); 

     // Prevent using images internal thumbnail 
     fullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); 
     fullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); 

     if (onlyResizeIfWider) 
     { 
      if (fullsizeImage.Width <= newWidth) 
      { 
       newWidth = fullsizeImage.Width; 
      } 
     } 

     int newHeight = fullsizeImage.Height * newWidth/fullsizeImage.Width; 
     if (newHeight > maxHeight) 
     { 
      // Resize with height instead 
      newWidth = fullsizeImage.Width * maxHeight/fullsizeImage.Height; 
      newHeight = maxHeight; 
     } 

     System.Drawing.Image newImage = fullsizeImage.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero); 

     // Clear handle to original file so that we can overwrite it if necessary 
     fullsizeImage.Dispose(); 
     // Save resized picture 
     newImage.Save(MapPath(GlobalVariables.UploadPath + "/" + newFile)); 
    } 

Y at-il un moyen de réduire la taille du fichier, comme 150 haute/150 de large est assez petite. Je voudrais aller jusqu'à environ 250, mais si je montre 12 pouces ... il faut un certain temps pour charger.

Répondre

2

Oui absolument doit enregistrer en tant que fichier miniature et ne pas traiter tout le temps. A propos de l'image, essayez de faire un ajustement absolu sur un bloc de 8x8 ou 16x16 parce que c'est la taille que jpeg utilise pour le diviser et le compresser. Par exemple ne pas faire 150x150 parce que 150/8 = 18,75, utilisez 152x152 parce que 152/8 = 19

Ensuite, les propriétés qui réduisent la taille du fichier et de changer la qualité sont

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 

et est ici un exemple de How to: Use Interpolation Mode to Control Image Quality During Scaling

+0

Merci pour les blocs info. Très utile. Avec la qualité, j'utilise System.Drawing.Image - et ce type d'objet n'a pas les propriétés mentionnées. Devrais-je utiliser Bitmap à la place, puis enregistrez-vous toujours en tant que Jpeg, une fois en utilisant les propriétés mentionnées ci-dessus? – Craig

+0

@cdotlister oui utilisez mieux une procédure de vignette plus détaillée que vous pouvez contrôler plus pense. – Aristos

+0

Merci - Je ne sais pas comment utiliser ces propriétés sur mon Bitmap ... BitmapObject.InterpolationMode ne fonctionnera pas. – Craig

Questions connexes