2010-06-02 128 views
4

我试图重新调整上传JPEG在asp.net.NET Drawing.Graphics.FromImage()返回空白黑色图像

所以我去:

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

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

回答

4

因为你没填充的区域与图像你从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); 

希望这有助于
迈拉

+0

谢谢,这是有道理的。我做了一点不同,但你的代码是很好的例证 – joox 2010-06-02 18:49:26

+0

你在哪里**完全用图像**背景填充区域? – 2012-04-17 10:39:58

+0

在g.DrawImage(img,drect)行中; ,这段代码确实填充了背景! – Myra 2012-04-17 13:08:22

0

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

'b.Save(...)'不保存的图像数据,但变换并不适用。 它可以很容易地通过使用'b = new Bitmap(original,newWidth,newHeight)来重新缩放''但我实际上需要对原始图像进行一系列转换,包括重新缩放,裁剪和旋转,所以试图通过'Graphics',并将最终结果渲染成位图。我误解了'Graphics'对象吗? – joox 2010-06-02 15:37:21

+0

什么是正确的模式1)采取jpeg文件2)顺序应用一些转换到它3)保存它?听起来很简单... – joox 2010-06-02 15:44:16

+0

我认为这更接近地说你误解了变换。大约7年前我从大学开始就没有处理过变形,所以我有点生疏。但我做了一个旋转的简单测试,并且工作。诀窍是你不旋转图像数据,你旋转图形上下文,然后使用该旋转的上下文来绘制图像。所以在我的情况下,调用g.RotateTransform()需要在调用g.DrawImage()之前发生。这怎么会最终影响你......很难说。但是转换的累积效应可能很有趣,并且操作顺序可能很重要。 – joelt 2010-06-02 16:17:45