.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(...)

Другие вопросы по тегам