Высококачественная библиотека масштабирования изображений [закрыто]

, если для вас работает «фокус» (т. е. оставаться видимым, когда элемент имеет фокус после щелчка), тогда см. этот существующий ответ SO:

Скрыть Показать список содержимого только с CSS, не используется javascript

141
задан John Saunders 11 September 2014 в 20:49
поделиться

9 ответов

Вот приятно прокомментированный класс помощника Обработки изображения, что можно посмотреть на и использование. Я записал его как пример того, как выполнить определенные задачи обработки изображения в C#. Вы будете интересоваться функция ResizeImage, которая берет Систему. Рисунок. Изображение, ширина и высота как аргументы.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;

namespace DoctaJonez.Drawing.Imaging
{
    /// <summary>
    /// Provides various image untilities, such as high quality resizing and the ability to save a JPEG.
    /// </summary>
    public static class ImageUtilities
    {    
        /// <summary>
        /// A quick lookup for getting image encoders
        /// </summary>
        private static Dictionary<string, ImageCodecInfo> encoders = null;

        /// <summary>
        /// A lock to prevent concurrency issues loading the encoders.
        /// </summary>
        private static object encodersLock = new object();

        /// <summary>
        /// A quick lookup for getting image encoders
        /// </summary>
        public static Dictionary<string, ImageCodecInfo> Encoders
        {
            //get accessor that creates the dictionary on demand
            get
            {
                //if the quick lookup isn't initialised, initialise it
                if (encoders == null)
                {
                    //protect against concurrency issues
                    lock (encodersLock)
                    {
                        //check again, we might not have been the first person to acquire the lock (see the double checked lock pattern)
                        if (encoders == null)
                        {
                            encoders = new Dictionary<string, ImageCodecInfo>();

                            //get all the codecs
                            foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
                            {
                                //add each codec to the quick lookup
                                encoders.Add(codec.MimeType.ToLower(), codec);
                            }
                        }
                    }
                }

                //return the lookup
                return encoders;
            }
        }

        /// <summary>
        /// Resize the image to the specified width and height.
        /// </summary>
        /// <param name="image">The image to resize.</param>
        /// <param name="width">The width to resize to.</param>
        /// <param name="height">The height to resize to.</param>
        /// <returns>The resized image.</returns>
        public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height)
        {
            //a holder for the result
            Bitmap result = new Bitmap(width, height);
            //set the resolutions the same to avoid cropping due to resolution differences
            result.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            //use a graphics object to draw the resized image into the bitmap
            using (Graphics graphics = Graphics.FromImage(result))
            {
                //set the resize quality modes to high quality
                graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //draw the image into the target bitmap
                graphics.DrawImage(image, 0, 0, result.Width, result.Height);
            }

            //return the resulting bitmap
            return result;
        }

        /// <summary> 
        /// Saves an image as a jpeg image, with the given quality 
        /// </summary> 
        /// <param name="path">Path to which the image would be saved.</param> 
        /// <param name="quality">An integer from 0 to 100, with 100 being the 
        /// highest quality</param> 
        /// <exception cref="ArgumentOutOfRangeException">
        /// An invalid value was entered for image quality.
        /// </exception>
        public static void SaveJpeg(string path, Image image, int quality)
        {
            //ensure the quality is within the correct range
            if ((quality < 0) || (quality > 100))
            {
                //create the error message
                string error = string.Format("Jpeg image quality must be between 0 and 100, with 100 being the highest quality.  A value of {0} was specified.", quality);
                //throw a helpful exception
                throw new ArgumentOutOfRangeException(error);
            }

            //create an encoder parameter for the image quality
            EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            //get the jpeg codec
            ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");

            //create a collection of all parameters that we will pass to the encoder
            EncoderParameters encoderParams = new EncoderParameters(1);
            //set the quality parameter for the codec
            encoderParams.Param[0] = qualityParam;
            //save the image using the codec and the parameters
            image.Save(path, jpegCodec, encoderParams);
        }

        /// <summary> 
        /// Returns the image codec with the given mime type 
        /// </summary> 
        public static ImageCodecInfo GetEncoderInfo(string mimeType)
        {
            //do a case insensitive search for the mime type
            string lookupKey = mimeType.ToLower();

            //the codec to return, default to null
            ImageCodecInfo foundCodec = null;

            //if we have the encoder, get it to return
            if (Encoders.ContainsKey(lookupKey))
            {
                //pull the codec from the lookup
                foundCodec = Encoders[lookupKey];
            }

            return foundCodec;
        } 
    }
}
<час>

Обновление

Несколько человек просили в комментариях образцы того, как использовать класс ImageUtilities, таким образом, здесь Вы идете.

//resize the image to the specified height and width
using (var resized = ImageUtilities.ResizeImage(image, 50, 100))
{
    //save the resized image as a jpeg with a quality of 90
    ImageUtilities.SaveJpeg(@"C:\myimage.jpeg", resized, 90);
}

Примечание

Помнит, что изображения доступны, таким образом, необходимо присвоить результат Вашего изменять размеры к объявлению использования (или Вы могли использовать попытку наконец и удостовериться, что звоните, располагают в Вашем наконец).

232
ответ дан Doctor Jones 11 September 2014 в 20:49
поделиться
  • 1
    Почему эта элегантность не более известна? Я обычно чувствую, что у меня есть почти педантичное знание PHP, но этот драгоценный камень, кажется, вышел из меня.Спасибо!! – orca 6 May 2013 в 21:09

Попробуйте различные значения за Графику. InterpolationMode. Существует несколько типичных алгоритмов масштабирования, доступных в GDI +. Если один из них достаточен для Вашей потребности, можно пойти этим путем вместо того, чтобы полагаться на внешнюю библиотеку.

4
ответ дан OregonGhost 11 September 2014 в 20:49
поделиться
  • 1
    That' ll работают пока мы don' t полагают, что ложные значения $x ' set'. – Adam Bellaire 2 October 2008 в 15:51
  • 1
    Разъясниться для любого с неудачей для изучения этого в 2012 (или позже!): ключу обертывали Вашу 100%-ю таблицу width в элемент с hasLayout (например, #myDiv в Joel' s пример, отделение с zoom:1 для инициирования hasLayout) В элементе прокрутки с overflow:auto. Это вызывает IE к обратному течению ширина таблицы ПОСЛЕ принятия во внимание ширины вертикальной полосы прокрутки. – Jason Suárez 8 February 2012 в 18:12

Протестированные библиотеки как Imagemagick и GD доступен для.NET

, Вы могли также читать на вещах как бикубическая интерполяция и записать свое собственное.

10
ответ дан kitsune 11 September 2014 в 20:49
поделиться

Можно попробовать dotImage, один из продуктов моей компании, который включает объект для передискретизации изображения, который имеет 18 типов фильтра для различных уровней качества.

Типичное использование:

// BiCubic is one technique available in PhotoShop
ResampleCommand resampler = new ResampleCommand(newSize, ResampleMethod.BiCubic);
AtalaImage newImage = resampler.Apply(oldImage).Image;

, кроме того, dotImage включает 140 некоторые нечетные команды обработки изображений включая многие фильтры, подобные тем в PhotoShop, если это - то, что Вы ищете.

3
ответ дан plinth 11 September 2014 в 20:49
поделиться
  • 1
    @Chad: Вы могли обеспечить скрипку, которая показывает, что это действительно работает с набором переполнения на внутреннем отделении. Поскольку that' s, в чем я нуждаюсь, тогда как я могу только заставить его работать наоборот. – raphinesse 5 December 2011 в 11:21

Существует статья о Проекте Кода об использовании GDI + для.NET, чтобы сделать фото изменение размеров, использующее, скажем, Бикубическую интерполяцию.

была также другая статья об этой теме на другом блоге (сотрудник MS, я думаю), но я не могу найти ссылку нигде.: (Возможно, кто-то еще может найти его?

0
ответ дан 11 September 2014 в 20:49
поделиться

При рисовании изображения с помощью GDI +, это масштабируется вполне хорошо, по-моему. Можно использовать это для создания масштабированного изображения.

, Если Вы хотите масштабировать свое изображение с GDI +, можно сделать что-то вроде этого:

Bitmap original = ...
Bitmap scaled = new Bitmap(new Size(original.Width * 4, original.Height * 4));
using (Graphics graphics = Graphics.FromImage(scaled)) {
  graphics.DrawImage(original, new Rectangle(0, 0, scaled.Width, scaled.Height));
}
15
ответ дан Hallgrim 11 September 2014 в 20:49
поделиться

Я заметил, что эта статья упоминается в коде Paint.NET для передискретизации изображения: Различные простые методы обработки изображений Пола Бурка.

0
ответ дан 23 November 2019 в 23:10
поделиться

вы можете попробовать этот вариант, если это lowres cgi 2D Image Filter

0
ответ дан 23 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: