.net Drawing. Графика. 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 );
  }
 }

та же история - чистый черный корректных размеров

5
задан joox 2 June 2010 в 14:08
поделиться

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);

Надеюсь, это поможет
Майра

5
ответ дан 14 December 2019 в 19:03
поделиться

Попробуйте это: - получите изображение из вашего потока - создайте новый битмап нужного размера - получите объект Graphics из нового битмапа, а не из оригинального - вызовите g.DrawImage(original, 0, 0, done.Width, done.Height)

Редактирование: Проблема в этом разделе:

using (Bitmap done = new Bitmap(w, h, g)) 
  { 
   done.Save( Server.MapPath(saveas), ImageFormat.Jpeg ); 
  }

Вы создаете черный битмап с разрешением, заданным g. На самом деле вы не создаете битмап с какими-либо данными изображения, поступающими из g. На самом деле, я не думаю, что объект Graphics хранит данные изображения, которые вы действительно можете передавать, он просто позволяет вам манипулировать некоторым объектом, который хранит данные изображения.

Попробуйте заменить это на b.Save(...)

0
ответ дан 14 December 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: