从HttpPostedFileBase创建的位图保存的图像比原始上传的文件更暗

时间:2014-12-15 20:08:52

标签: c# .net asp.net-mvc-5

在我的MVC 5网络项目中,我将作为表单一部分发布的位图保存到服务器上的文件夹中。在保存图像的同时,我还创建了上传图像的2个不同大小的缩略图。所有三个图像文件都已成功创建,但全尺寸,未修改的图像保存为“变暗”图像文件。原版的版本,并作为这样的。通过" dimmed"我的字面意思是保存全尺寸和不受干扰的文件看起来好像50%透明的黑色图像层已保存在原始文件之上。

这是将图像保存到磁盘的代码:

private ObservationImage CreateObservationImage(UploadedFileInfo file, Observation obs)
    {
        Guid guid = Guid.NewGuid();
        string p = Path.Combine(Server.MapPath("~/ObservationImages/"), guid.ToString() + ".png");
        string thumb = Path.Combine(Server.MapPath("~/ObservationImages/thumbnails/"), guid.ToString() + ".png");
        string mid = Path.Combine(Server.MapPath("~/ObservationImages/midsize/"), guid.ToString() + ".png");
        Bitmap thisBitmap = new Bitmap(file.File.InputStream);

        ImageCodecInfo codecInfo = GetEncoderInfo("image/png");
        Encoder qualityEncoder = Encoder.Quality;
        Encoder colourDepthEncoder = Encoder.ColorDepth;
        Encoder compressionEncoder = Encoder.Compression;
        EncoderParameters myEncoderParameters = new EncoderParameters(3);
        EncoderParameter myQualityEncoderParameter = new EncoderParameter(qualityEncoder, 100L); // 100% quality
        EncoderParameter myColourDepthEncoderParameter = new EncoderParameter(colourDepthEncoder, 24L); // 24 bpp
        EncoderParameter myCompressionEncoderParameter = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionNone); // no compression
        myEncoderParameters.Param[0] = myQualityEncoderParameter;
        myEncoderParameters.Param[1] = myColourDepthEncoderParameter;
        myEncoderParameters.Param[2] = myCompressionEncoderParameter;

        double ratio = (double)thisBitmap.Height / (double)thisBitmap.Width;
        Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
        Image thisThumbnail = thisBitmap.GetThumbnailImage(120, (int)(120 * ratio), myCallback, IntPtr.Zero);
        thisThumbnail.Save(thumb, codecInfo, myEncoderParameters);

        myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
        Image thisMidsize = thisBitmap.GetThumbnailImage(400, (int)(400 * ratio), myCallback, IntPtr.Zero);
        thisMidsize.Save(mid);

        thisBitmap.Save(p, codecInfo, myEncoderParameters);

        ObservationImage result = new ObservationImage
        {
            ImageLocalPath = p,
            ImageURL = "/ObservationImages/" + guid.ToString() + ".png",
            ThumbnailURL = "/ObservationImages/thumbnails/" + guid.ToString() + ".png",
            MidSizeUrl = "/ObservationImages/midsize/" + guid.ToString() + ".png",
            ObservationId = obs.ObservationId
        };
        return result;
    }

UploadedFileInfo类型来自自定义模型绑定器,该绑定器为上载的文件提供对HttpPostedFileBase的访问。 thisThumbnail和thisMidsize文件完全保存,thisBitmap按照描述保存。

现在,这一切在VS2013使用的开发Web服务器上都能正常工作,但是当部署到IIS7.5服务器时,问题就变得很暗了#34;形象发生了。我试过强迫我能想到的每个编码器参数都无济于事。保存缩略图没有任何不良影响。

某些文件确实正确上传,但我没有看到相关性 - 例如原始文件类型和大小似乎没有问题。这真的让我头疼不已,想知道发生了什么。 IIS框(Windows Server 2008 R2)上没有任何不寻常的设置,如前所述,它在我的开发机器(Windows 7 x64)上运行的VS2013上100%有效。

任何人都有关于我应该在哪里寻找的指示?

1 个答案:

答案 0 :(得分:0)

在这个例子中,Bitmap.Save将“未改变”的图像保存为48bpp而不是原始的32bpp。我不得不将它强制为32,但我需要测试其他一些具有各种bitdepths的图像。