2011-04-10 6 views
0

나는 내 자신의 DIB/BMP 디코더를 작성하고 있습니다. 이미 다른 것들이 있지만, 이미지 처리에 대해 배우고 있습니다. 그리고 포인터를 픽셀에 저장하고 관리합니다. 관련 HBITMAP을 작성하기위한 차원 만이 오류가 온 유지 :비트 맵으로 hBitmap을 저장할 때 일반 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; 
    } 
아래
Generic Error Occured in GDI+. 

는 스택 추적 및 코드입니다

나는 무엇이 잘못 되었는가 전혀 모르지만 PCX 파일에 대해 비슷한 기능을 사용하고 단색 이미지를 제외하고 모두 정상적으로 렌더링됩니다. 누구든지 도울 수 있다면, 나는 매우 감사하고있다.

답변

0

그것은

어쨌든 몇 가지가 시도 ... 입력 당신은 당신의 전화에있는 parametes 모르고 얘기하기 어렵다 : CreateBitmap에서

  • 체크 반환 값은()!
  • 비트 평면의 수는
  • 을 (면의 수를 알고 있다면 당신은 매개 변수로 전달하지 않아도, 비트 맵 형식하여 GDI + 열거와) 대신에 비트 맵 생성자를 사용 권리 확인

    // 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

관련 문제