Search code examples
asp.net-core-mvcimageprocessor

ImageProcessorCore: Attempt to resample image results in zero-length response


I am trying to resample a JPG image from 300dpi to 150dpi and am getting back a zero-length file.

Controller's ActionResult:

public ActionResult ViewImage(string file, int dpi = 300, bool log = true)
{
    FileExtensions fileExtensions = new FileExtensions();
    ImageExtensions imageExtensions = new ImageExtensions();

    FileModel fileModel = fileExtensions.GetFileModel(file);
    string contentType = fileModel.FileType;
    byte[] fileData = fileModel.FileData;
    string fileName = Path.GetFileNameWithoutExtension(fileModel.FileName) + "_" + dpi + "DPI" + Path.GetExtension(fileModel.FileName);
    FileStreamResult resampledImage = imageExtensions.ResampleImage(fileData, contentType, dpi);
    resampledImage.FileDownloadName = fileName;
    return resampledImage;
}

ResampleImage method:

public FileStreamResult ResampleImage(byte[] fileData, string contentType, int targetDPI)
{
    MemoryStream outputStream = new MemoryStream();
    using (Stream sourceStream = new MemoryStream(fileData))
    { 
        Image image = new Image(sourceStream);
        image.HorizontalResolution = targetDPI;
        image.VerticalResolution = targetDPI;
        JpegEncoder jpegEncoder = new JpegEncoder();
        jpegEncoder.Quality = 100;
        image.Save(outputStream, jpegEncoder);
    }           
    FileStreamResult file = new FileStreamResult(outputStream, contentType);
    return file;
}

Solution

  • I thought I best answer here since we've already dealt with it on the issue tracker.

    ImageProcessorCore at present (2016-08-03) is alpha software and as such is unfinished. When you were having the issue, horizontal and vertical resolution was not settable in jpeg images. This is now solved.

    Incidentally there are overloads that allow saving as jpeg without having to create your own JpegEncoder instance.

    image.SaveAsJpeg(outputStream);