2012-09-19 23 views
2

失敗,我從源中提取下面的代碼是有關這個:代碼的DrawImage本地工作,但在Azure中有一個ArgumentException

using (Bitmap spriteBitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb)) 
{ 
     using (Graphics spriteGraphics = Graphics.FromImage(spriteBitmap)) 
     { 
       Rectangle imageRect = new Rectangle(0, 0, imageInfo.Width, imageInfo.Height); 

       using (Bitmap clonedImageBitmap = imageInfo.ImageBitmap.Clone(imageRect, spriteBitmap.PixelFormat)) 
       { 
         clonedImageBitmap.SetResolution(spriteBitmap.HorizontalResolution, spriteBitmap.VerticalResolution); 

         spriteGraphics.DrawImage(
           clonedImageBitmap, 
           mappedImageInfo.X, mappedImageInfo.Y, 
           imageRect, 
           GraphicsUnit.Pixel); 

           spriteGraphics.Flush(FlushIntention.Flush); 
       } 

       imageInfo.DisposeBitmap(); 
     } 
} 

此代碼工作完美局部與蔚藍的計算模擬器。但是當我部署它並執行代碼時,它不再工作,並且在着名的ArgumentException「參數無效」的spriteGraphics.DrawImage失敗。

出於測試目的,我記錄了clonedImageBitmap的細節以查看是否有不同之處。我發現的唯一不同於本地和雲中的是.Flags - >本地我擁有77842,並且在雲77846中似乎設置了ImageFlagsHasTranslucent,但如果這導致了雲中的問題以及此問題可以超越我目前的知識。

也許有人可以幫我解決這個奇怪的問題?

在此先感謝。

HeManNew

回答

1

我會說,這肯定是很難的問題是工作,由於應用程序,它運行的性質。

這裏的主要問題是您使用的類/ API來自System.Drawing命名空間,您必須知道此命名空間中的類是爲Windows窗體設計的。他們不支持在Windows或ASP.NET服務中使用,這就是爲什麼只要您可以避免在Windows Azure Web角色或工作者角色中使用這些最佳選項。雲應用程序主要是在後臺工作的Web應用程序或應用程序,這是避免對System.Draw類/ api依賴的主要原因.Drawing是進一步依賴GDI使情況更加複雜的關鍵。

如果API失敗,那就是它在Web環境中不兼容的原因,即使它可用。即使在Windows Azure文檔中,也建議避免完全使用System.Drawing中的API/Class,並且如果它必須在您的代碼中存在,那麼如果您打算在您自己的Windows Azure應用程序中使用這些類,則應該進行徹底的測試。

+0

感謝您的解釋。不幸的是,我不知道使用Azure的System.Drawing是不可取的,但該功能(動態生成Css Sprites)是我的應用程序所必需的,所以我無法排除這一點。但是,對於我來說,在計算模擬器的本地開發中,一切都運行良好。 – HeManNew

+0

原因非常簡單,因爲System.Drawing類依賴於基於顯示特定組件(即較低層庫和驅動程序)的GDI。這是您的計算機和Windows Azure計算機之間的主要區別。雲計算機中的GDI特定模塊無法與使用桌面上的性能和功能相匹配,以及爲什麼使用這些API時要小心 – AvkashChauhan

相關問題