public static Bitmap ImageToBitmap(ColorFloatImageFormat image) { Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb); LockBitmapInfo lbi = LockBitmap(b); try { for (int j = 0; j < image.Height; j++) { for (int i = 0; i < image.Width; i++) { ColorFloatPixel p = image[i, j]; lbi.data[lbi.linewidth * j + i * 4] = p.B <0.0f ? (byte)0 : p.B> 255.0f ? (byte)255 : (byte)p.B; lbi.data[lbi.linewidth * j + i * 4 + 1] = p.G <0.0f ? (byte)0 : p.G> 255.0f ? (byte)255 : (byte)p.G; lbi.data[lbi.linewidth * j + i * 4 + 2] = p.R <0.0f ? (byte)0 : p.R> 255.0f ? (byte)255 : (byte)p.R; } } } finally { UnlockBitmap(lbi); } return(b); }
/// <summary> /// Преобразование из одномерного массива пикселей в матрицу, в соответвии с размерами картинки /// </summary> /// <param name="image"></param> /// <returns></returns> public static ColorFloatPixel[,] ColorImage(ColorFloatImageFormat image) { ColorFloatPixel[,] imageData = new ColorFloatPixel[image.Height, image.Width]; for (int height = 0, countPixel = 0; height < image.Height; ++height) { for (int width = 0; width < image.Width; ++width) { imageData[height, width] = image.RawData[countPixel++]; } } return(imageData); }
/// <summary> /// //Разложение в rgb и запись в массив /// </summary> /// <param name="B"></param> /// <returns></returns> public static ColorFloatImageFormat BitmapToColorFloatImage(Bitmap B) { int W = B.Width, H = B.Height; ColorFloatImageFormat res = new ColorFloatImageFormat(W, H); if (B.PixelFormat == PixelFormat.Format8bppIndexed) { Color[] pi = B.Palette.Entries; byte[] pal = new byte[1024]; for (int i = 0; i < pi.Length; i++) { Color C = pi[i]; pal[i * 4] = C.B; pal[i * 4 + 1] = C.G; pal[i * 4 + 2] = C.R; pal[i * 4 + 3] = C.A; } LockBitmapInfo lbi = LockBitmap(B, PixelFormat.Format8bppIndexed, 1); try { for (int j = 0; j < H; j++) { for (int i = 0; i < W; i++) { int c = lbi.data[lbi.linewidth * j + i]; int b = pal[c * 4]; int g = pal[c * 4 + 1]; int r = pal[c * 4 + 2]; res[i, j] = new ColorFloatPixel() { B = b, G = g, R = r, A = 0.0f }; } } } finally { UnlockBitmap(lbi); } } else { LockBitmapInfo lbi = LockBitmap(B); try { for (int j = 0; j < H; j++) { for (int i = 0; i < W; i++) { int b = lbi.data[lbi.linewidth * j + i * 4]; int g = lbi.data[lbi.linewidth * j + i * 4 + 1]; int r = lbi.data[lbi.linewidth * j + i * 4 + 2]; res[i, j] = new ColorFloatPixel() { B = b, G = g, R = r, A = 0.0f }; } } } finally { UnlockBitmap(lbi); } } return(res); }