2010-06-02 129 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