public void CanReadAndWriteData(int depth) { using (var pix = Pix.Create(Width, Height, depth)) { var pixData = pix.GetData(); for (var y = 0; y < Height; y++) { var line = (uint *)pixData.Data + (y * pixData.WordsPerLine); for (var x = 0; x < Width; x++) { var val = (uint)((y * Width + x) % (1 << depth)); uint readVal; if (depth == 1) { PixData.SetDataBit(line, x, val); readVal = PixData.GetDataBit(line, x); } else if (depth == 2) { PixData.SetDataDIBit(line, x, val); readVal = PixData.GetDataDIBit(line, x); } else if (depth == 4) { PixData.SetDataQBit(line, x, val); readVal = PixData.GetDataQBit(line, x); } else if (depth == 8) { PixData.SetDataByte(line, x, val); readVal = PixData.GetDataByte(line, x); } else if (depth == 16) { PixData.SetDataTwoByte(line, x, val); readVal = PixData.GetDataTwoByte(line, x); } else if (depth == 32) { PixData.SetDataFourByte(line, x, val); readVal = PixData.GetDataFourByte(line, x); } else { throw new NotSupportedException(); } Assert.AreEqual(readVal, val); } } } }
// Copies in-memory pixels out of an OpenCV Mat into a PixData that Tesseract / Leptonica understands private unsafe void TransferData(MatOfByte3 mat3, PixData pixData) { var indexer = mat3.GetIndexer(); for (int y = 0; y < mat3.Height; y++) { uint *pixLine = (uint *)pixData.Data + (y * pixData.WordsPerLine); for (int x = 0; x < mat3.Width; x++) { Vec3b color = indexer[y, x]; PixData.SetDataFourByte(pixLine, x, BitmapHelper.EncodeAsRGBA(color.Item0, color.Item1, color.Item2, 255)); } } }
private static unsafe void TransferDataFormat32bppRgb(BitmapData imgData, PixData pixData) { int pixelFormat = (int)imgData.PixelFormat; int height = imgData.Height; int width = imgData.Width; for (int index1 = 0; index1 < height; ++index1) { byte *numPtr1 = (byte *)((IntPtr)(void *)imgData.Scan0 + index1 * imgData.Stride); uint *data = (uint *)((IntPtr)(void *)pixData.Data + (index1 * pixData.WordsPerLine) * 4); for (int index2 = 0; index2 < width; ++index2) { byte *numPtr2 = numPtr1 + (index2 << 2); byte blue = *numPtr2; byte green = numPtr2[1]; byte red = numPtr2[2]; PixData.SetDataFourByte(data, index2, BitmapHelper.EncodeAsRGBA(red, green, blue, byte.MaxValue)); } } }
private unsafe void TransferDataFormat24bppRgb(BitmapData imgData, PixData pixData) { var imgFormat = imgData.PixelFormat; var height = imgData.Height; var width = imgData.Width; for (int y = 0; y < height; y++) { byte *imgLine = (byte *)imgData.Scan0 + (y * imgData.Stride); uint *pixLine = (uint *)pixData.Data + (y * pixData.WordsPerLine); for (int x = 0; x < width; x++) { byte *pixelPtr = imgLine + x * 3; byte blue = pixelPtr[0]; byte green = pixelPtr[1]; byte red = pixelPtr[2]; PixData.SetDataFourByte(pixLine, x, BitmapHelper.EncodeAsRGBA(red, green, blue, 255)); } } }
private unsafe void TransferDataFormat32bppArgb(BitmapData imgData, PixData pixData) { var imgFormat = imgData.PixelFormat; var height = imgData.Height; var width = imgData.Width; for (int y = 0; y < height; y++) { byte *imgLine = (byte *)imgData.Scan0 + (y * imgData.Stride); uint *pixLine = (uint *)pixData.Data + (y * pixData.WordsPerLine); for (int x = 0; x < width; x++) { byte *pixelPtr = imgLine + (x << 2); byte blue = *pixelPtr; byte green = *(pixelPtr + 1); byte red = *(pixelPtr + 2); byte alpha = *(pixelPtr + 3); PixData.SetDataFourByte(pixLine, x, BitmapHelper.EncodeAsRGBA(red, green, blue, alpha)); } } }