.net Drawing.Graphics.FromImage() возвращает пустое черное изображение
Я пытаюсь изменить масштаб загруженного JPEG в asp.net
Итак, я иду:
Image original = Image.FromStream(myPostedFile.InputStream);
int w=original.Width, h=original.Height;
using(Graphics g = Graphics.FromImage(original))
{
g.ScaleTransform(0.5f, 0.5f); ... // e.g.
using (Bitmap done = new Bitmap(w, h, g))
{
done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
//saves blank black, though with correct width and height
}
}
это сохраняет девственный черный JPEG любой файл, который я даю. Хотя, если я беру поток входного изображения сразу в done
растровое изображение, он повторно сжимает и сохраняет это хорошо, как:
Image original = Image.FromStream(myPostedFile.InputStream);
using (Bitmap done = new Bitmap(original))
{
done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
}
Должен ли я сделать магию с G?
Upd: я пытался:
Image original = Image.FromStream(fstream);
int w=original.Width, h=original.Height;
using(Bitmap b = new Bitmap(original)) //also tried new Bitmap(w,h)
using (Graphics g = Graphics.FromImage(b))
{
g.DrawImage(original, 0, 0, w, h); //also tried g.DrawImage(b, 0, 0, w, h)
using (Bitmap done = new Bitmap(w, h, g))
{
done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
}
}
та же история - чистый черный правильных размеров
2 ответа
Поскольку вы не заполнили область фоном изображения, которое вы читаете из inputStream, таким образом вы можете получить только чистое изображение.
Вместо масштабирования изображения вы можете использовать заливку фона в области с измененным размером.
Проверь это:
Image img = Image.FromFile(Server.MapPath("a.png"));
int w = img.Width;
int h = img.Height;
//Create an empty bitmap with scaled size,here half
Bitmap bmp = new Bitmap(w / 2, h / 2);
//Create graphics object to draw
Graphics g = Graphics.FromImage(bmp);
//You can also use SmoothingMode,CompositingMode and CompositingQuality
//of Graphics object to preserve saving options for new image.
//Create drawing area with a rectangle
Rectangle drect = new Rectangle(0, 0, bmp.Width, bmp.Height);
//Draw image into your rectangle area
g.DrawImage(img, drect);
//Save your new image
bmp.Save(Server.MapPath("a2.jpg"), ImageFormat.Jpeg);
Надеюсь это поможет
Майра
Попробуйте это: - получить изображение из вашего потока - создать новое растровое изображение правильного размера - получить объект Graphics из нового растрового изображения, а не исходного - вызвать g.DrawImage(original, 0, 0, done.Width, done.Рост)
Редактировать: проблема в этом разделе:
using (Bitmap done = new Bitmap(w, h, g))
{
done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
}
Вы создаете черное растровое изображение с разрешением, заданным g. Вы на самом деле не создаете растровое изображение с данными изображения, полученными из g. На самом деле, я не думаю, что объект Graphics на самом деле хранит данные изображения, которые вы действительно можете передать, он просто позволяет вам манипулировать некоторым объектом, который хранит данные изображения.
Попробуйте заменить это на b.Save(...)