My useless image manipulation program

using pointers to edit pictures blows

So i got an idea in class a while ago and thought it would be a good learning experience.  Completely useless, but fun to stare at.

what it does:

takes a picture (jpg format), then makes it look wavy using a sin wave.

It started out pretty easy until i realized that using GetPixel and SetPixel is slow as balls.  The alternative was editing memory directly :(

btw, if anyone knows how to edit a picture using pointers vertically instead of horizonatally, please let me know.  My brain shutdown when i tried to figure this out, so im just rotating the image and changing it again.  I know the theory of how to do it but the code eludes me.

 

heres the fun code:

Code: c#
  1.         private void makeMovingImage()
  2.         {
  3.             Image temp;
  4.             imageArray = new Bitmap[num];
  5.             for (int x = 0; x < num; x++)
  6.             {
  7.                 temp = image2;
  8.                 imageArray[x] = makeNewImage(temp);
  9.                 temp = new Bitmap(imageArray[x]);
  10.                 temp.RotateFlip(RotateFlipType.Rotate90FlipNone);
  11.                 temp = makeNewImage(temp);
  12.                 temp.RotateFlip(RotateFlipType.Rotate270FlipNone);
  13.                 imageArray[x] = new Bitmap(temp);
  14.                 ctr += .2;
  15.             }
  16.         }
  17.         private unsafe Bitmap makeNewImage(Image newimg)
  18.         {
  19.             Bitmap image = new Bitmap(newimg);
  20.             Bitmap newImage = new Bitmap(image.Width + 20, image.Height);
  21.             Rectangle imageRect = new Rectangle(0, 0, image.Width, image.Height);
  22.             Rectangle newImageRect = new Rectangle(0, 0, newImage.Width, newImage.Height);
  23.             BitmapData imageData = image.LockBits(imageRect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
  24.             BitmapData newImageData = newImage.LockBits(newImageRect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
  25.             int oldSize = imageData.Stride * image.Height;
  26.             int newSize = newImageData.Stride * newImage.Height;
  27.             byte[] oldData = new byte[oldSize];
  28.             byte[] newData = new byte[newSize];
  29.             System.Runtime.InteropServices.Marshal.Copy(imageData.Scan0, oldData, 0, oldSize);
  30.             System.Runtime.InteropServices.Marshal.Copy(newImageData.Scan0, newData, 0, newSize);
  31.             byte* oldPointer = (byte*)imageData.Scan0;
  32.             byte* newPointer = (byte*)newImageData.Scan0;
  33.             int offset = 0;
  34.             int pixel = 0;
  35.             for (int y = 0; y < image.Height; y++)
  36.             {
  37.                 offset = (int)Math.Round((10 * Math.Sin(ctr)));
  38.                 ctr += .2;
  39.                 offset += 10;
  40.                 for (int counter = 0; counter < offset; counter++)
  41.                 {
  42.                     newPointer[0] = 0;
  43.                     newPointer[1] = 255;
  44.                     newPointer[2] = 0;
  45.                     newPointer += 3;
  46.                     pixel++;
  47.                 }
  48.                 for (int x = 0; x < image.Width; x++)
  49.                 {
  50.                     newPointer[0] = oldPointer[0];
  51.                     newPointer[1] = oldPointer[1];
  52.                     newPointer[2] = oldPointer[2];
  53.                     oldPointer += 3;
  54.                     newPointer += 3;
  55.                     pixel++;
  56.                 }
  57.                 for (int counter = pixel; counter < newImage.Width; counter++)
  58.                 {
  59.                     newPointer[0] = 0;
  60.                     newPointer[1] = 255;
  61.                     newPointer[2] = 0;
  62.                     newPointer += 3;
  63.                 }
  64.                 pixel = 0;
  65.                 oldPointer += imageData.Stride - (imageData.Width * 3);
  66.                 newPointer += newImageData.Stride - (newImageData.Width * 3);
  67.             }
  68.             image.UnlockBits(imageData);
  69.             newImage.UnlockBits(newImageData);
  70.             return newImage;
  71.         }

I use this code with a kinda double buffered form to show a moving picture. if anyone wants the full source code, i have no problems sending it, i just dont want to show off my horrible coding practices

 

will post pics after i finish my visual studio 2008 install

 

moving image

 

8,517 views 0 replies