我正在尝试在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做一些魔法吗?
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 );
}
}
相同的故事 - 正确尺寸的纯黑色
答案 0 :(得分:5)
由于您没有填充图像背景区域,您正在从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);
希望这会有所帮助 迈拉
答案 1 :(得分:0)
试试这个: - 从您的流中获取图像 - 创建一个正确大小的新位图 - 从新位图获取Graphics对象,而不是原始位图 - 调用g.DrawImage(原始,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(...)
替换它