cimage.cs

来自「C#写的复数和傅立叶变换算法」· CS 代码 · 共 85 行

CS
85
字号
using System;
using System.Drawing;
using System.Drawing.Imaging;
using Exocortex.DSP;

namespace ImageFilterApp
{
	/// <summary>
	/// Summary description for CImage.
	/// <p>Comments? Questions? Bugs? Tell Ben Houston at ben@exocortex.org</p>
	/// <p>Version: March 22, 2002</p>
	/// </summary>
	public class CImage {

		//--------------------------------------------------------------------------------------
		
		public unsafe CImage( string fileName ) {
			Bitmap bitmap = new Bitmap( fileName );
			Size correctSize = new Size(
				(int) Math.Pow( 2, Math.Ceiling( Math.Log( bitmap.Width, 2 ) ) ),
				(int) Math.Pow( 2, Math.Ceiling( Math.Log( bitmap.Height, 2 ) ) ) );
			if( correctSize != bitmap.Size ) {
				bitmap = new Bitmap( bitmap, correctSize );
			}

			_size = correctSize;
			_data = new ComplexF[ this.Width * this.Height ];
			Rectangle rect = new Rectangle( 0, 0, this.Width, this.Height );
			BitmapData bitmapData = bitmap.LockBits( rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb );
			int* colorData = (int*) bitmapData.Scan0.ToPointer();
			for( int i = 0; i < this.Width * this.Height; i ++ ) {
				Color c = Color.FromArgb( colorData[ i ] );
				_data[ i ].Re = ( (float)c.R + (float)c.G + (float)c.B ) / ( 3f * 256f );
			}
			bitmap.UnlockBits( bitmapData );
		}

		//--------------------------------------------------------------------------------------

		protected ComplexF[]	_data = null;
		public ComplexF[]	Data {
			get	{	return	_data;	}
		}

		protected bool	_frequencySpace = false;
		public bool	FrequencySpace {
			get	{	return	_frequencySpace;	}
			set	{	_frequencySpace = value;	}
		}

		protected Size	_size = Size.Empty;
		public Size	Size {
			get	{	return	_size;	}
		}
		public int	Width {
			get	{	return	_size.Width;	}
		}
		public int	Height {
			get	{	return	_size.Height;	}
		}

		//--------------------------------------------------------------------------------------

		public unsafe Bitmap	ToBitmap() {
			Bitmap bitmap = new Bitmap( this.Width, this.Height, PixelFormat.Format32bppArgb );
			Rectangle rect = new Rectangle( 0, 0, this.Width, this.Height );
			BitmapData bitmapData = bitmap.LockBits( rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb );
			int* colorData = (int*) bitmapData.Scan0.ToPointer();
			for( int i = 0; i < this.Width * this.Height; i ++ ) {
				int c = Math.Min( 255, Math.Max( 0, (int)( 256 * _data[ i ].GetModulus() ) ) );
				colorData[ i ] = Color.FromArgb( c, c, c ).ToArgb();
			}
			bitmap.UnlockBits( bitmapData );
			return	bitmap;
		}

		public void	Save( string fileName ) {
			this.ToBitmap().Save( fileName );
		}
		
		//--------------------------------------------------------------------------------------

	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?