Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #4
0
        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); //отправляем на отрисовку картинку
        }
Exemple #5
0
        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);
        }