public void ExecuteCommand() { var image = _imageFactory(); if (image == null) { return; } var pixels = new byte[image.PixelHeight * image.BackBufferStride]; image.CopyPixels(pixels, image.BackBufferStride, 0); var imageRes = new WriteableBitmap(2 * image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); var resultPixels = new byte[imageRes.PixelHeight * imageRes.BackBufferStride]; for (int i = 0; i < image.PixelHeight; i++) { for (int j = 0; j < image.PixelWidth; j++) { int indexOld = i * image.BackBufferStride + 4 * j; int indexNew = i * imageRes.BackBufferStride + 4 * j; for (int c = 0; c < 3; ++c) { resultPixels[indexNew + c] = pixels[indexOld + c]; } } } for (int i = 0; i < image.PixelHeight; i++) { int k = 1; for (int j = imageRes.PixelWidth - 1; j > image.PixelWidth; j--) { int indexFlip = i * imageRes.BackBufferStride + 4 * j; int index = i * image.BackBufferStride + 4 * (j + k - imageRes.PixelWidth); for (int c = 0; c < 3; c++) { resultPixels[indexFlip + c] = pixels[index + c]; } k += 2; } } imageRes.WritePixels(new Int32Rect(0, 0, imageRes.PixelWidth, imageRes.PixelHeight), resultPixels, imageRes.BackBufferStride, 0); OnImageChanged?.Invoke(imageRes); }
public void ExecuteCommand() { var image = _imageFactory(); if (image == null) { return; } var pixels = new byte[image.PixelHeight * image.BackBufferStride]; image.CopyPixels(pixels, image.BackBufferStride, 0); var imageRes = new WriteableBitmap(2 * image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); var resultPixels = new byte[imageRes.PixelHeight * imageRes.BackBufferStride]; for (int i = 0; i < image.PixelWidth; ++i) { for (int j = 0; j < image.PixelHeight; ++j) { int indexRead = j * image.BackBufferStride + 4 * i; int indexWrite = j * imageRes.BackBufferStride + 4 * i; for (int c = 0; c < 4; ++c) { resultPixels[indexWrite + c] = pixels[indexRead + c]; } } } for (int i = image.PixelWidth - 1; i > 0; --i) { for (int j = image.PixelHeight - 1; j > 0; --j) { int indexRead = j * image.BackBufferStride + 4 * i; int indexWrite = j * imageRes.BackBufferStride - 4 * i + imageRes.BackBufferStride; for (int c = 0; c < 4; ++c) { resultPixels[indexWrite + c] = pixels[indexRead + c]; } } } imageRes.WritePixels(new Int32Rect(0, 0, imageRes.PixelWidth, imageRes.PixelHeight), resultPixels, imageRes.BackBufferStride, 0); OnImageChanged?.Invoke(imageRes); }
public void ExecuteCommand() { var image = _imageFactory(); if (image == null) { return; } var pixels = new byte[image.PixelHeight * image.BackBufferStride]; image.CopyPixels(pixels, image.BackBufferStride, 0); var imageRes = new WriteableBitmap((isHorizontalFlip ? 1 : 2) * image.PixelWidth, (isHorizontalFlip ? 2 : 1) * image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); var resultPixels = new byte[imageRes.PixelHeight * imageRes.BackBufferStride]; //todo for (int i = 0; i < image.PixelHeight; ++i) { for (int j = 0; j < image.PixelWidth; ++j) { int index = i * image.BackBufferStride + 4 * j; int indexRes = i * imageRes.BackBufferStride + 4 * j; int indexFlip; if (isHorizontalFlip) { indexFlip = (imageRes.PixelHeight - i - 1) * imageRes.BackBufferStride + 4 * j; } else { indexFlip = (i + 1) * imageRes.BackBufferStride - 4 * (j + 1); } for (int k = 0; k < 3; ++k) { resultPixels[indexRes + k] = pixels[index + k]; resultPixels[indexFlip + k] = pixels[index + k]; } } } isHorizontalFlip = !isHorizontalFlip; imageRes.WritePixels(new Int32Rect(0, 0, imageRes.PixelWidth, imageRes.PixelHeight), resultPixels, imageRes.BackBufferStride, 0); OnImageChanged?.Invoke(imageRes); }
public void ExecuteCommand() { var image = _imageFactory(); //var newImage = _imageFactory(); if (image == null) { return; } //todo //public WriteableBitmap(int pixelWidth,int pixelHeight,double dpiX,double dpiY,PixelFormat pixelFormat,BitmapPalette palette) //инициализация нового WriteableBitmap var newImage = new WriteableBitmap(image.PixelWidth * 2, image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); //инициализация newImage с двойным размером по ширине image var pixels = new byte[image.PixelHeight * image.BackBufferStride]; //инициализация массива pixels для считывания image image.CopyPixels(pixels, image.BackBufferStride, 0); //копируем массив точек в pixels var newPixels = new byte[image.PixelHeight * image.BackBufferStride * 2]; var pixelsNormal = new byte[image.BackBufferStride]; var pixelsReverse = new byte[image.BackBufferStride]; for (int i = 0; i < image.PixelHeight; i++) { for (int j = 0; j < image.PixelWidth; j++) { int index = i * image.BackBufferStride + 4 * j; for (int c = 0; c < 4; ++c) //поворачиваем по 4 байта, чтобы сохранить последовательность RGBA { pixelsReverse[image.BackBufferStride - 4 * (j + 1) + c] = pixels[index + c]; //пишем массим реверсивной строки pixelsNormal[4 * j + c] = pixels[index + c]; //пишем массив нормальной строки } } pixelsNormal.CopyTo(newPixels, i * newImage.BackBufferStride) //копируем массив в результирующий; pixelsReverse.CopyTo(newPixels, i * newImage.BackBufferStride + image.BackBufferStride) //добавляем сдвиг; } newImage.WritePixels(new Int32Rect(0, 0, newImage.PixelWidth, newImage.PixelHeight), newPixels, newImage.BackBufferStride, 0); OnImageChanged?.Invoke(newImage); //отправляем на отрисовку картинку }
public void ExecuteCommand() { var image = _imageFactory(); if (image == null) { return; } var pixels = new byte[image.PixelHeight * image.BackBufferStride]; image.CopyPixels(pixels, image.BackBufferStride, 0); var imageRes = new WriteableBitmap(2 * image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); var resultPixels = new byte[imageRes.PixelHeight * imageRes.BackBufferStride]; //todo imageRes.WritePixels(new Int32Rect(0, 0, imageRes.PixelWidth, imageRes.PixelHeight), resultPixels, imageRes.BackBufferStride, 0); OnImageChanged?.Invoke(imageRes); }
public void ExecuteCommand() { var image = _imageFactory(); if (image == null) { return; } var pixels = new byte[image.PixelHeight * image.BackBufferStride]; image.CopyPixels(pixels, image.BackBufferStride, 0); WriteableBitmap imageRes; byte[] resultPixels; if (!isEvenNumbered) { // Отражение по горизонтали imageRes = new WriteableBitmap(2 * image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); resultPixels = new byte[imageRes.PixelHeight * imageRes.BackBufferStride]; for (int i = 0; i < image.PixelWidth; ++i) { for (int j = 0; j < image.PixelHeight; ++j) { // Исходное изображение int initialSourceIndex = j * image.BackBufferStride + 4 * i; int initialResultIndex = j * image.BackBufferStride * 2 + 4 * i; // Изображение, отраженное по горизонтали int flippedSourceIndex = j * image.BackBufferStride + 4 * (image.PixelWidth - 1 - i); int flippedResultIndex = j * image.BackBufferStride * 2 + 4 * (image.PixelWidth + i); for (int c = 0; c < 3; ++c) { resultPixels[initialResultIndex + c] = pixels[initialSourceIndex + c]; resultPixels[flippedResultIndex + c] = pixels[flippedSourceIndex + c]; } } } } else { // Отражение по вертикали imageRes = new WriteableBitmap(image.PixelWidth, 2 * image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette); resultPixels = new byte[imageRes.PixelHeight * imageRes.BackBufferStride]; for (int i = 0; i < image.PixelWidth; ++i) { for (int j = 0; j < image.PixelHeight; ++j) { // Исходное изображение int initialSourceIndex = j * image.BackBufferStride + 4 * i; int initialResultIndex = initialSourceIndex; // Изображение, отраженное по вертикали int flippedSourceIndex = (image.PixelHeight - 1 - j) * image.BackBufferStride + 4 * i; int flippedResultIndex = (image.PixelHeight + j) * image.BackBufferStride + 4 * i; for (int c = 0; c < 3; ++c) { resultPixels[initialResultIndex + c] = pixels[initialSourceIndex + c]; resultPixels[flippedResultIndex + c] = pixels[flippedSourceIndex + c]; } } } } isEvenNumbered = !isEvenNumbered; imageRes.WritePixels(new Int32Rect(0, 0, imageRes.PixelWidth, imageRes.PixelHeight), resultPixels, imageRes.BackBufferStride, 0); OnImageChanged?.Invoke(imageRes); }