Преобразование изображения при манипулировании байтами файла - PullRequest
0 голосов
/ 02 июня 2011

У меня проблема.Когда изображения сохраняются в моей базе данных, они сохраняются с байтами файла, и к этой записи присваивается идентификационный номер.Существует файл .ashx, который берет этот ссылочный идентификационный номер и получает информацию о файле / байты файла и отображает изображение или разрешает загрузку изображения.

img src="/download.ashx?id=THEREFID

Это выше будет отображать изображение на странице.Если бы я просто поместил ссылку на страницу .ashx, она бы загрузила изображение.Это отлично.Однако некоторые из моих изображений сохраняются как .TIF, и мне нужно преобразовать их в .jpeg.

У меня есть класс с именем FileData

public string FileName;
public byte[] theData;
public long FileSizeBytes;
public string MIME;
public string Extension;

На моей странице .ashx у меня есть методкоторый загружает вышеупомянутый класс FileData.Затем класс FileData вместе с классом HttpContext отправляется методу:

private void Process(HttpContext context, FileData file)
{
    context.Response.ContentTYpe = file.MIME;
    context.Response.AddHeader("Content-Disposition", "attachment; filename=" 
        + file.FileName.Replace(' ', '_') 
        + file.FileExtension);
    context.Response.AddHeader("Content-Length", file.FileSizeBytes.ToString());
    context.Response.Expires = 0;
    context.Response.BinaryWrite(file.Data);
    context.ApplicationInstance.CompleteRequest();
}

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

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Я понял это.Вот что я сделал:

Image img = Image.FromStream(new MemoryStream(file.Data));
Bitmap bmp = (Bitmap)img;

EncoderParameters encoderParams = new EncoderParameters();
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 50L);

ImageCodecInfo codecInfo = GetEncoderInfo("image.jpeg");
MemoryStream newImage = new MemoryStream();

bmp.Save(newImage, codecInfo, encoderParams);

byte[] newData = newImage.ToArray();

//Overwritting the original FileData
file.Data = newData;
file.FileSizeBytes = newData.Length;
file.MIME = "image/jpeg";
0 голосов
/ 02 июня 2011

я бы сделал это, как вы и хотели ...

более или менее так:

                System.Drawing.Bitmap tiffImage;
                using(BinaryWriter  baseWriter = new BinaryWriter(new MemoryStream()))
                {
                    baseWriter.Write(tiffData);
                    baseWriter.BaseStream.Position = 0;
                    tiffImage = new System.Drawing.Bitmap(baseWriter.BaseStream);
                }

                MemoryStream jpgStream = new MemoryStream();

                tiffImage.Save(jpgStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                jpgStream.Position = 0;
                using (BinaryReader br = new BinaryReader(jpgStream))
                {
                    context.Response.BinaryWrite(br.ReadBytes(jpgStream.Length));
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...