본문 바로가기

프로그래밍/C,C++

[C#] 이미지 처리 기본 사항들

System.Drawing.Image

System.Drawing.Bitmap

System.Drawing.Graphics

 

 

Image는 이미지 데이터의 전체적인 처리를 위한 클래스이다.

Bitmap은 Image의 서브 클래스이며, 다양한 생성자를 제공해 Image 생성시 필요한 설정이 자동으로 적용되도록 지원한다. 그리고, 이미지의 세부 정보와 픽셀처리등의 메쏘드가 추가된다.

Graphics는 그래픽 객체를 그려주는 클래스이다.

 

 

> 이미지 부르기

static Image.FromFile

static Bitmap.FromResource

 

ex)

Image image = Image.FromFile( "test.png" );
Bitmap bmp = new Bitmap( "test.png" );

 

 

> 이미지 리소스 해제

Image.dispose

 

 

> 이미지 저장하기

Image.Save

 

ex)

image.Save( "test.png" );
image.Save( "test.bmp", System.Drawing.Imaging.ImageFormat.Bmp );

 

 

> 회전

Image.RotateFlip

 

ex)

bmp.RotateFlip( RotateFlipType );

 

 

> 이미지에서 Graphics 객체 얻기(비트맵에 그리기)

static Graphics.FromImage

 

ex)

Image image = new Bitmap( width, height );
Graphics g = Graphics.FromImage( image );

 

 

> 투명색

Bitmap.MakeTransparent

 

 

> 버블 버퍼링

자동 더블 버퍼링 : 컨트롤 생성자나 폼 로드전에 스타일 설정

SetStyle( ControlStyles.OptimizedDoubleBuffer, true );

SetStyle( ControlStyles.AllPaintingInWmPaint, true );

SetStyle( ControlStyles.UserPaint, true);

 

수동 더블 버퍼링 : 

화면(컨트롤)과 동일한 사이즈의 Bitmap 생성 해당 객체를 사용해 구현.

 

 

> 픽셀 관련

static Image.GetPixelFormatSize : 픽셀별 비트수

Bitmap.GetPixel( x, y )

Bitmap.SetPixel( x, y, color )

 

> 바이트 버퍼 읽기/쓰기

LockBits 으로 메모리를 읽기/쓰기 모드로 lock 하고, BitmapData 객체를 얻어

해당 주소에 접근 할 수 있다.

Bitmap.LockBits

Bitmap.UnLockBits

BitmapData.Scan0

System.Runtime.InteropServices.Marshal.Copy

 

ex)

using System.Drawing;

Bitmap bmp = new Bitmap( "test.jpg" );
Rectangle rect = new Rectangle( 0, 0, bmp.Width, bmp.Height );
BitmapData bmpData = bmp.LockBits( rect, Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat );

// 데이터 시작 포인터
IntPtr ptr = bmpData.Scan0;

// 사이즈 ( 스캔라인 사이즈 * 높이 )
// 일반적으로 width * height 이지만 bmp의 경우 가로크기가 4의 배수로 dummy 값이 들어가므로
// 스캔라인 사이즈를 사용
int size = bmpData.Stride * bmp.Height
byte[] array = new byte[ size ];

// lock 된 bmpData에서 array로 복사(read)
System.Runtime.InteropServices.Marshal.Copy( ptr, array, 0, size );

// array 에서 lock된 bmpData에 복사(write)
System.Runtime.interopServices.Marshal.Copy( array, 0, ptr, size );

 

'프로그래밍 > C,C++' 카테고리의 다른 글

[Win API] Console project  (0) 2017.12.06
[C++] 시스템 클럭 밀리세컨드 얻기  (0) 2017.12.06
Kinect sdk 이미지 얻기  (0) 2017.10.26
C# OLEDB 엑셀 읽기  (0) 2016.02.21
[C#] 파일 읽고,쓰기 기초  (0) 2013.09.12
[C#] 이벤트  (0) 2013.09.12
[C#] 폼 띄우기  (0) 2013.09.12
GCC 옵션  (0) 2011.07.21
POSIX 쓰레드 함수들  (0) 2010.04.16
[Linux] 세마포어 설정  (0) 2010.04.15