miniature, couper redimensionner et télécharger sur DB

voix
2

J'utilise ce code pour créer des vignettes, puis stocker l'original et la miniature dans un DB. Il crée tn qui sont toujours d'une taille fixe et si l'image originale est dépérir qu'il est plus élevé, il est coupé, puis prennent la taille fixe.

Le code fonctionne mais je voudrais vraiment apprécier l'aide de modifier ce code pour faire ce qui suit (je l'ai essayé, mais n'a pas réussi):

  • Faire des vignettes de haute qualité

  • couper la hauteur si l'image est bien plus grand
    que sa largeur (Si la largeur est
    200px et la hauteur est 1000px ce qui se passera?)

  • Accepter et tiff .png.

Voici le code à ce jour:

    public void imgUpload()
    {
        if (ImgUpload.PostedFile != null)
        {
            System.Drawing.Image image_file = System.Drawing.Image.FromStream(ImgUpload.PostedFile.InputStream);
            string fileName = Server.HtmlEncode(ImgUpload.FileName);
            string extension = System.IO.Path.GetExtension(fileName);

            bool sizeError = false;

            if(image_file.Width < 200)
                sizeError = true;

            if(image_file.Height < 250)
                sizeError = true;

            if ((extension.ToUpper() == .JPG) && !sizeError)
            {

                //**** Resize image section ****  
                int image_height = image_file.Height;
                int image_width = image_file.Width;
                int original_width = image_width;
                int original_height = image_height;
                int max_height = 250;
                int max_width = 200;

                Rectangle rect;

                if (image_width > image_height)
                {
                    image_width = (image_width * max_height) / image_height;
                    image_height = max_height;
                    rect = new Rectangle(((image_width - max_width) / 2), 0, max_width, max_height);
                }
                else
                {
                    image_height = (image_height * max_width) / image_width;
                    image_width = max_width;
                    rect = new Rectangle(0, ((image_height - max_height) / 2), max_width, max_height);
                }

                Bitmap bitmap_file = new Bitmap(image_file, image_width, image_height);
                Bitmap new_bitmap_file = bitmap_file.Clone(rect, bitmap_file.PixelFormat);

                System.IO.MemoryStream stream = new System.IO.MemoryStream();

                new_bitmap_file.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                stream.Position = 0;

                byte[] imageThumbnail = new byte[stream.Length + 1];
                stream.Read(imageThumbnail, 0, imageThumbnail.Length);

                Bitmap Original_bitmap_file = new Bitmap(image_file, original_width, original_height);
                System.IO.MemoryStream Original_stream = new System.IO.MemoryStream();

                Original_bitmap_file.Save(Original_stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                Original_stream.Position = 0;

                byte[] imageOriginal = new byte[Original_stream.Length + 1];
                Original_stream.Read(imageOriginal, 0, imageOriginal.Length);
                //**** End resize image section ****  

                saveImage(imageThumbnail, imageOriginal, IDTextBox.Text);
                lblOutput.Visible = false;
            }
            else
            {
                lblOutput.Text = Please only upload .jpg files and make sure the size is minimum 200x250;
                lblOutput.Visible = true;
            }
        }
        else
        {
            lblOutput.Text = No file selected;
            lblOutput.Visible = true;
        }
    }
Créé 17/08/2010 à 16:44
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

J'utilise le code suivant lors de la création des vignettes pour http://www.inventerat.se et quelques autres sites et il fonctionne comme un charme:

    public static Bitmap WithinMaxSize(Image imgPhoto, int maxWidth, int maxHeight)
    {
        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;

        int destWidth;
        int destHeight;

        float sourceAspect = sourceWidth / (sourceHeight * 1.0F);
        float maxAspect = maxWidth / (maxHeight * 1.0F);
        if (sourceAspect > maxAspect)
        {
            // Width is limiting.
            destWidth = maxWidth;
            destHeight = (int)Math.Round(destWidth / sourceAspect);
        }
        else
        {
            // Height is limiting.
            destHeight = maxHeight;
            destWidth = (int)Math.Round(destHeight * sourceAspect);
        }

        Bitmap bmPhoto = new Bitmap(destWidth, destHeight);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.CompositingMode = CompositingMode.SourceCopy;
        grPhoto.CompositingQuality = CompositingQuality.HighQuality;
        grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto, 0, 0, destWidth, destHeight);

        grPhoto.Dispose();
        return bmPhoto;
    }

Il suffit de ne pas oublier de jeter le Bitmap retour de cette méthode.

Il ne fonctionne pas très bien si les utilisateurs téléchargent très grandes images (par exemple> 5000 * 5000 pixels) bien. Si tel est une exigence, je recommande d'utiliser ImageMagick ou un ensemble d'imagerie similaire.

Pour accepter et tiff .png, juste ajuster la façon dont vous vérifiez l'extension de fichier afin que vous acceptez « .png », « TIF » et « tiff » aussi bien. Prise en charge de tiff est un peu peu précis dans .NET, bien que depuis tiff lui-même est seulement un conteneur pour encodages nombreux.

Créé 27/08/2010 à 07:48
source utilisateur

voix
1

Voici un exemple de l'échelle et recadrer une image:

Bitmap b = new Bitmap(200, 1000);
using (var g = Graphics.FromImage(b))
{
    g.DrawLine(Pens.White, 0, 0, b.Width, b.Height);
}
b.Save("b.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Bitmap thumb = new Bitmap(100, 100);
using (var g = Graphics.FromImage(thumb))
{
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.DrawImage(b, new Rectangle(0,0,100,100), new Rectangle(0, 400, 200, 200), GraphicsUnit.Pixel);
}
thumb.Save("thumb.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Je pense que vous pouvez adapter le code à tous ce qui est et si est quand la hauteur / largeur de rapport est élevé, etc.

Créé 17/08/2010 à 17:03
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more