CSharpUtils.BitmapUtils.TransferChannelsDataInterleaved C# (CSharp) Метод

TransferChannelsDataInterleaved() публичный статический Метод

public static TransferChannelsDataInterleaved ( Rectangle Rectangle, Bitmap Bitmap, byte NewDataPtr, Direction Direction ) : void
Rectangle System.Drawing.Rectangle
Bitmap System.Drawing.Bitmap
NewDataPtr byte
Direction Direction
Результат void
		public static unsafe void TransferChannelsDataInterleaved(Rectangle Rectangle, Bitmap Bitmap, byte* NewDataPtr, Direction Direction, params BitmapChannel[] Channels)
		{
			int NumberOfChannels = 1;
			foreach (var Channel in Channels)
			{
				if (Channel != BitmapChannel.Indexed)
				{
					NumberOfChannels = 4;
					break;
				}
			}

			Bitmap.LockBitsUnlock(Rectangle, (NumberOfChannels == 1) ? PixelFormat.Format8bppIndexed : PixelFormat.Format32bppArgb, (BitmapData) =>
			{
				for (int y = 0; y < BitmapData.Height; y++)
				{
					byte* BitmapPtr = ((byte*)BitmapData.Scan0.ToPointer()) + BitmapData.Stride * y;
					byte* DataPtr = NewDataPtr + (NumberOfChannels * BitmapData.Width) * y;
					int z = 0;
					for (int x = 0; x < BitmapData.Width; x++)
					{
						for (int c = 0; c < NumberOfChannels; c++)
						{
							byte* DataPtrPtr = &DataPtr[z + c];
							byte* BitmapPtrPtr = &BitmapPtr[z + (int)Channels[c]];

							if (Direction == BitmapUtils.Direction.FromBitmapToData)
							{
								*DataPtrPtr = *BitmapPtrPtr;
							}
							else
							{
								*BitmapPtrPtr  = * DataPtrPtr;
							}
						}
						z += NumberOfChannels;
					}
				}
			});
		}
	}