Я написал этот код, чтобы обрезать и изменить размер изображения на лету. Отправляю обработанное изображение в браузер как <img src = "imagehandler.aspx?img=1.jpg">:
imagehandler.aspx:
<%@ Page Language = "C#"%>
<%@ import Namespace = "System.Drawing" %>
<%@ import Namespace = "System.IO" %>
<script runat = "server">
System.Drawing.Image oldImage, newImage,cloned,tempImage;
void Page_Load(Object sender, EventArgs e) {
string strFileName = Convert.ToString(Request.QueryString["img"]);
oldImage = System.Drawing.Image.FromFile(Server.MapPath(strFileName));
rect= new Rectangle(0,50,100,100);
cloned = new Bitmap(oldImage ).Clone(rect, tempImage.PixelFormat);
newImage = new Bitmap(cloned);
cloned.Dispose();
Response.ContentType = "image/jpeg";
newImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
oldImage.Dispose();
newImage.Dispose();
oldImage = null;
newImage = null;
}
</script>
Теперь я хочу добавить контроль качества к выходному изображению, и я нашел этот вопрос / ответ. Этот ответ предлагает метод, который сохраняет изображение на диск. Я пытался приспособить это к своей цели. В настоящее время я могу сохранить его только на диске, и метод недействителен. Я не знаю, как передать вывод своим собственным кодам перед потоковой передачей результата в браузер:
private void VaryQualityLevel(bmp1)
{
ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder= System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jgpEncoder,myEncoderParameters);
}
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}





Вы можете сохранить растровое изображение прямо в MemoryStream и делать с ним все, что захотите. Ваш кодировщик будет применен к изображению внутри этого потока. Вместо того, чтобы передавать путь к файлу в качестве первого параметра метода Save, просто передайте экземпляр MemoryStream. Если я правильно помню, есть также способ передать этот поток напрямую в качестве ответа браузеру.
using(var ms = new MemoryStream())
{
bmp1.Save(ms, jgpEncoder, myEncoderParameters);
var bmp2 = new BitMap(ms);
//do whatever you want with this image
}
Не забывайте использовать метод using statment или dispose для sfream, чтобы избежать утечки памяти.
Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/api/system.drawing.bitmap?view=netframework-4.7.2
Спасибо . Но я сделал то же самое в своих кодах. Основная проблема - передать вывод второго метода первому, а не потоку. На самом деле я думаю, что мне нужно вернуть растровое изображение и получить его в первую очередь?
Нет. От VaryQualityLevel до моего собственного кода в первом блоке вопроса.
Ok. Исходя из моего опыта, растровое изображение / изображение в C# не позволяет изменять размер / качество существующих объектов, обычно это заканчивается созданием нового объекта. Из потока вы можете легко создать новое растровое изображение и вернуть его. Я обновил свой ответ выше.
В скрипте отсутствует закрывающий
}.