ASP.net миниатюры изображений идут в оттенках серого (иш) - странно! - PullRequest
1 голос
/ 03 ноября 2010

Исходное изображение:

alt text

Это изменяет размер, чтобы выглядеть так:

alt text

ВСЕ изображения, хранящиеся на сервере, имеют правильный синий фон с градиентом. Но когда он изменен и обслуживается, он показывает черный фон! И значительно потемнело.

На моем локальном сервере проблем нет, он делает это только на живом сервере!

Мой код миниатюры:

<%@ WebHandler Language="C#" Class="Thumbnail" %>

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Web;

public class Thumbnail : IHttpHandler {

    private int _thumbnailSize = 150;

    public void ProcessRequest(HttpContext context) {

        // Name of photo file
        string photoName = context.Request.QueryString["p"];

        // Size index
        string sizeIndex = context.Request.QueryString["s"];
        string saveAction = context.Request.QueryString["a"];
        int width;
        int height;
        int maxWidth = 0;
        int maxHeight = 0;
        Bitmap photo;
        bool customResize = false;

        //Get original path of picture
        string photoPath = "";
        if (photoName.IndexOf('/') > 0)
        {
            photoPath = context.Server.MapPath(photoName);
        }
        else
        {

            photoPath = context.Server.MapPath("../uploads/originals/" + photoName);
        }

        // Create new bitmap
        try {
            photo = new Bitmap(photoPath);
        }
        catch (ArgumentException) {
            throw new HttpException(404, "Photo not found.");
        }
        context.Response.ContentType = "image/png";

        // Initialise width as native
        width = photo.Width;
        height = photo.Height;

        // Slideshow image (big)
        if (sizeIndex == "1")
        {
            // Set max widths and heights
            maxWidth = 500;
            maxHeight = 300;
            customResize = true;

        }
        // Big(ger) thumbnail
        else if (sizeIndex == "3")
        {
            // Set max widths and heights
            maxWidth = 150;
            maxHeight = 150;
            customResize = true;

        }
        // Big(ger) thumbnail
        else if (sizeIndex == "4")
        {
            // Set max widths and heights
            maxWidth = 30;
            maxHeight = 30;
            customResize = true;
        }
        // Standard thumbnail
        else
        {
            maxHeight = 75;

            // Normalise height
            if (photo.Height > maxHeight)
            {
                height = maxHeight;
                double newWidth = photo.Width / (photo.Height / height);
                width = int.Parse(newWidth.ToString());
            }
            else
            {
                height = photo.Height;
                width = photo.Width;
            }
        }

        // Resize
        if (customResize && (width > maxWidth || height > maxHeight))
        {

            double scale = Math.Min(1, Math.Min((double)maxWidth / (double)photo.Width, (double)maxHeight / (double)photo.Height));
            width = int.Parse((Math.Round((double)photo.Width * scale,0)).ToString());
            height = int.Parse((Math.Round((double)photo.Height * scale,0)).ToString());
        }

        // Generate and show image
        Bitmap target = new Bitmap(width, height);
        using (Graphics graphics = Graphics.FromImage(target)) {
            graphics.CompositingQuality = CompositingQuality.HighSpeed;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.CompositingMode = CompositingMode.SourceCopy;
            graphics.DrawImage(photo, 0, 0, width, height);
            using (MemoryStream memoryStream = new MemoryStream()) {
                target.Save(memoryStream, ImageFormat.Png);
                //OutputCacheResponse(context, File.GetLastWriteTime(photoPath));
                //using (FileStream diskCacheStream = new FileStream(cachePath, FileMode.CreateNew)) {
                //    memoryStream.WriteTo(diskCacheStream);
                //}

                // If savinf
                if (saveAction == "s")
                {
                    FileStream outStream = File.OpenWrite(context.Server.MapPath("../uploads/gallery/" + photoName));
                    memoryStream.WriteTo(outStream);
                    outStream.Flush();
                    outStream.Close();
                }
                else{
                    memoryStream.WriteTo(context.Response.OutputStream);   
                }
            }
        }



    }

    private static void OutputCacheResponse(HttpContext context, DateTime lastModified) {
       /*   HttpCachePolicy cachePolicy = context.Response.Cache;
            cachePolicy.SetCacheability(HttpCacheability.Public);
            cachePolicy.VaryByParams["p"] = true;
            cachePolicy.SetOmitVaryStar(true);
            cachePolicy.SetExpires(DateTime.Now + TimeSpan.FromDays(7));
            cachePolicy.SetValidUntilExpires(true);
            cachePolicy.SetLastModified(lastModified);*/
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Учитывая, что это, кажется, проблема с отображением, я обнаружил, что по опыту я обнаружил, что PNG хранит вещи, которые вы, вероятно, обычно не хотите использовать для многих целей.Эта миниатюра содержит фрагменты данных, касающихся цветовых пространств и других подобных вещей.Они, как было известно, облажали вещи вокруг справедливого бита.Я предполагаю, что они хороши для фотографий, но они могут вызвать кошмар при работе в Интернете и попытке сопоставить цвет в PNG с цветом HTML на странице ...

Смотрите здесь: http://the.earth.li/~chris/temp/tomgullenquestion_1XOA8.png

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

1 голос
/ 03 ноября 2010

Я бы настоятельно рекомендовал вам проверить, очистив кэш (например, CTRL-F5 в Chrome).Возможно, ваше изображение (когда-то) было повреждено, и именно эта поврежденная версия находится в кэше.

Я также не вижу проблем с представленной большой / маленькой версией.

1 голос
/ 03 ноября 2010

Первое, что я вижу, это то, что вы не утилизировали BitMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...