6

我正在尝试在 asp.net 中重新缩放上传的 jpeg

所以我去:

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做一些魔法吗?

更新:我试过:

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

同样的故事 - 正确尺寸的纯黑色

4

2 回答 2

6

由于您没有用从 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);

希望这有助于
迈拉

于 2010-06-02T15:15:14.280 回答
0

试试这个: - 从您的流中获取图像 - 创建正确大小的新位图 - 从新位图中获取图形对象,而不是原始位图 - 调用 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(...) 替换它

于 2010-06-02T13:18:39.150 回答