private void Create(int width, int height, CVDepth depth, int channels) { image = PInvoke.cvCreateImage(new __CvSize(width, height), (int)depth, channels); CVUtils.CheckLastError(); created = true; }
public unsafe CVImage(System.Drawing.Bitmap sourceImage) { System.Drawing.Rectangle rect = new System.Drawing.Rectangle(); rect.X = 0; rect.Y = 0; rect.Width = sourceImage.Width; rect.Height = sourceImage.Height; System.Drawing.Imaging.BitmapData bData = sourceImage.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // New implementation: int pixelSizeInBytes = 8; int numberOfChannels = 3; this.image = PInvoke.cvCreateImage( new __CvSize(sourceImage.Width, sourceImage.Height), pixelSizeInBytes, numberOfChannels); CVUtils.CheckLastError(); unsafe { int height = sourceImage.Height; int width = sourceImage.Width; byte *pRead = (byte *)bData.Scan0.ToPointer(); byte *pWrite = this.Internal.ToPointer()->imageData; int nReadStride = bData.Stride - width * numberOfChannels; int nWriteStride = this.Internal.ToPointer()->widthStep - width * numberOfChannels; for (int row = 0; row < height; ++row, pRead += nReadStride, pWrite += nWriteStride) { for (int col = 0; col < width; ++col, pRead += numberOfChannels, pWrite += numberOfChannels) { pWrite[0] = pRead[0]; // Blue pWrite[1] = pRead[1]; // Green pWrite[2] = pRead[2]; // Red } } } #region Old Implementation //__IplImagePtr tempImage = PInvoke.cvCreateImageHeader(new __CvSize(sourceImage.Width, sourceImage.Height), 8, Bitmap.GetPixelFormatSize(sourceImage.PixelFormat) / 8); //tempImage.ToPointer()->imageData = (byte*)bData.Scan0.ToPointer(); //__IplImagePtr[] dst = new __IplImagePtr[4]; //for (int i = 0; i < 4; ++i) //{ // dst[i] = IntPtr.Zero; //} //for (int i = 0; i < tempImage.ToPointer()->nChannels; i++) //{ // dst[i] = PInvoke.cvCreateImage(new __CvSize(sourceImage.Width, sourceImage.Height), 8, 1); //} //PInvoke.cvSplit( // tempImage, // dst[0], // dst[1], // dst[2], // dst[3]); //image = PInvoke.cvCreateImage(new __CvSize(sourceImage.Width, sourceImage.Height), 8, 3); //PInvoke.cvMerge(dst[0], dst[1], dst[2], IntPtr.Zero, image) ; //for (int i = 0; i < tempImage.ToPointer()->nChannels; i++) //{ // PInvoke.cvReleaseImage(ref dst[i]); //} #endregion created = true; sourceImage.UnlockBits(bData); }