2011-04-10 84 views
0

我正在編寫我自己的DIB/BMP解碼器(我知道已經有其他人了,但是我正在學習圖像處理),並且我設法將像素存儲在指針中並獲取相關尺寸寫一個HBITMAP,但這個錯誤一直出現:將hBitmap作爲位圖保存時的通用GDI +錯誤

Generic Error Occured in GDI+. 

下面是堆棧跟蹤和驗證碼:

at System.Drawing.Image.FromHbitmap(IntPtr hbitmap, IntPtr hpalette) 
at System.Drawing.Image.FromHbitmap(IntPtr hbitmap) 
at pcx_reader.bmp.BitmapFromPCXBits(Int32 height, Int32 width, Int32 numplanes, Int32 bpp, IntPtr pixels) 
at pcx_reader.MainWindow.button1_Click(Object sender, RoutedEventArgs e) 
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) 
at System.Windows.Controls.MenuItem.InvokeClickAfterRender(Object arg) 
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
at System.Threading.ExecutionContext.runTryCode(Object userData) 
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Windows.Threading.DispatcherOperation.Invoke() 
at System.Windows.Threading.Dispatcher.ProcessQueue() 
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
at System.Windows.Threading.Dispatcher.Run() 
at System.Windows.Application.RunDispatcher(Object ignore) 
at System.Windows.Application.RunInternal(Window window) 
at System.Windows.Application.Run(Window window) 
at System.Windows.Application.Run() 
at pcx_reader.App.Main() 
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ThreadHelper.ThreadStart() 

代碼:

public Bitmap BitmapFromPCXBits(int height, int width, int numplanes, int bpp, IntPtr pixels) 
    { 
     IntPtr hDc = CreateCompatibleDC(IntPtr.Zero); 
     IntPtr hBitmap = IntPtr.Zero; 
     IntPtr hOldBitmap = IntPtr.Zero; 

     hBitmap = CreateBitmap(width, height, (uint)numplanes, (uint)bpp, pixels); 
     hOldBitmap = SelectObject(hDc, hBitmap); 

     System.Drawing.Bitmap bmp = System.Drawing.Bitmap.FromHbitmap(hBitmap); 
     //Bitmap bmp = new Bitmap(width, height, stride, System.Drawing.Imaging.PixelFormat.Format1bppIndexed, pixels); 

     DeleteObject(SelectObject(hDc, hOldBitmap)); 

     DeleteDC(hDc); 

     return bmp; 
    } 

我不知道有什麼問題,但是我對PCX文件使用了一個類似的功能,並且它們都會失效,除了單色圖像以外,它們都可以正常顯示。如果有人能幫助,我會非常感激。

回答

0

這是很難說沒有知道什麼輸入指標的影響,你有你的電話......

反正幾件事情嘗試:

  • 檢查從CreateBitmap的返回值()!
  • 確保位平面的數目是正確
  • 使用位圖構造函數,而不是(用的GDI +枚舉爲位圖格式,如果是已知的飛機的數量,你可能並不需要把它作爲一個參數)

    // This works in C++

    HDC hOff = :: CreateCompatibleDC(NULL);

    位圖oDaBigOne(g_iWidth,g_iHeight,PixelFormat32bppARGB);

    HBITMAP hBMit = NULL;

    顏色oCol(0,0,0,0);

    oDaBigOne.GetHBITMAP(oCol,& hBMit);

    HGDIOBJ hSave = :: SelectObject(hOff,hBMit);

+0

謝謝,我現在使用System.Drawing.Bitmap構造函數的步幅,bpp,intptr等。 – user646265 2011-04-14 15:52:30