Как я могу изменить размер изображения из базы данных в C #, в хорошем качестве - PullRequest
0 голосов
/ 05 октября 2010

У меня есть следующий код C # (не мой), который извлекает изображение из базы данных и отображает его на веб-странице:

public partial class Image : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        getFullImage();
    }



    public void getFullImage()
    {
        SqlConnection objCon = new SqlConnection();
        objCon = new SqlConnection(Globals.ConnectionString);
        objCon.Open();

        String TmpStr;
        try
        {

            byte[] imgData = null;

            SqlCommand objCmd = new SqlCommand("Select * from Login where user_Name='" + Request["Id"].ToString() + "'", objCon);
            SqlDataReader reader = objCmd.ExecuteReader();


            while (reader.Read())
            {
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.AddHeader("Content-Disposition",
                    "attachment; filename=" + reader["ImageName"]);
                imgData = (byte[])reader["ImageFile"];
                TmpStr = reader["ImageFile"].ToString();
                TmpStr = TmpStr.Substring(1, TmpStr.Length - 1);
            }
            HttpContext.Current.Response.ContentType = "image/jpeg";
            HttpContext.Current.Response.BinaryWrite(imgData);
        }
        catch(Exception ex)
        {
            Response.Write(ex.Message.ToString());
        }
        finally
        {

        }
    }
}

Я знаю, что хранение изображений вбазы данных и использовать их таким образом, но я не хардкорный разработчик .NET и не могу переписать всю эту вещь (как бы мне этого хотелось!).

Во всяком случае, в настоящее времяописанный выше метод создает полноразмерные (часто огромные) изображения, размер которых затем изменяется с помощью CSS, что приводит к ужасному ухудшению качества.Я задавался вопросом, могу ли я что-нибудь сделать, чтобы изменить размер изображения перед рендерингом, так что улучшите качество и сократите время загрузки?

Спасибо за любые указатели люди ...

Ответы [ 4 ]

1 голос
/ 05 октября 2010

Я использую что-то вроде этого:

    using (Graphics g = Graphics.FromImage(targetImage)) 
    { 
        g.DrawImage(myImage, 0, 0, Width, Height); 
    } 

Возможно, вам придется поиграться с CompositingQuality, InterpolationMode и SmoothingMode, чтобы получить наилучшие результаты для конкретных изображений.

1 голос
/ 05 октября 2010

Вот несколько хороших ссылок / предложений по качественному изменению размеров изображений:

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

1 голос
/ 05 октября 2010

Я использовал эту функцию всякий раз, когда мне нужно было изменить размер растрового изображения ... я не писал этот код и даже не помню, откуда я его взял ... попробуйте

public static Bitmap ResizePhoto(Bitmap b, int nWidth, int nHeight)
{
    Bitmap bTemp = (Bitmap)b.Clone();
    b = new Bitmap(nWidth, nHeight, bTemp.PixelFormat);

    double nXFactor = (double)bTemp.Width / (double)nWidth;
    double nYFactor = (double)bTemp.Height / (double)nHeight;


    double fraction_x, fraction_y, one_minus_x, one_minus_y;
    int ceil_x, ceil_y, floor_x, floor_y;
    Color c1 = new Color();
    Color c2 = new Color();
    Color c3 = new Color();
    Color c4 = new Color();
    byte red, green, blue;

    byte b1, b2;

    for (int x = 0; x < b.Width; ++x)
        for (int y = 0; y < b.Height; ++y)
        {
            floor_x = (int)Math.Floor(x * nXFactor);
            floor_y = (int)Math.Floor(y * nYFactor);
            ceil_x = floor_x + 1;
            if (ceil_x >= bTemp.Width) ceil_x = floor_x;
            ceil_y = floor_y + 1;
            if (ceil_y >= bTemp.Height) ceil_y = floor_y;
            fraction_x = x * nXFactor - floor_x;
            fraction_y = y * nYFactor - floor_y;
            one_minus_x = 1.0 - fraction_x;
            one_minus_y = 1.0 - fraction_y;

            c1 = bTemp.GetPixel(floor_x, floor_y);
            c2 = bTemp.GetPixel(ceil_x, floor_y);
            c3 = bTemp.GetPixel(floor_x, ceil_y);
            c4 = bTemp.GetPixel(ceil_x, ceil_y);

            // Blue

            b1 = (byte)(one_minus_x * c1.B + fraction_x * c2.B);

            b2 = (byte)(one_minus_x * c3.B + fraction_x * c4.B);

            blue = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

            // Green

            b1 = (byte)(one_minus_x * c1.G + fraction_x * c2.G);

            b2 = (byte)(one_minus_x * c3.G + fraction_x * c4.G);

            green = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

            // Red

            b1 = (byte)(one_minus_x * c1.R + fraction_x * c2.R);

            b2 = (byte)(one_minus_x * c3.R + fraction_x * c4.R);

            red = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

            b.SetPixel(x, y, Color.FromArgb(255, red, green, blue));
        }

    return b;
}
0 голосов
/ 05 октября 2010

Вы можете использовать класс Image с методом GetThumbnailImage из пространства имен System.Drawing.Imaging.Что касается времени загрузки, то здесь есть две большие части: передача изображения и загрузка изображения из базы данных.Может быть, просто сохранить ссылку на файл, а затем использовать, который может быть альтернативой.

Редактировать: Уменьшение почти всегда приводит к некоторому снижению качества.Возможно, GetThumbnailImage лучше, поскольку он может использовать встроенные данные миниатюр, но не ожидайте того же качества, что и от алгоритмов профессионального уровня, подобных тем, которые используются в Photoshop.

...