.net Drawing.Graphics.FromImage () возвращает пустое черное изображение - PullRequest
5 голосов
/ 02 июня 2010

Я пытаюсь изменить масштаб загруженного 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 );
}

Должен ли я сделать магию с г?

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 ]

5 голосов
/ 02 июня 2010

Поскольку вы не заполнили область фоном изображения , который вы читаете из 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);

Надеюсь, это поможет
Myra

0 голосов
/ 02 июня 2010

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

Edit: Проблема в этом разделе:

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

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

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

...