블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday



ㅁ 이미지 다운로드 알집이용~?!

 

지난 12 22일 토요일에 있던 Hoons닷넷 세미나 중에 라이브코딩(?!)을 진행 하셨던 서동진님

Demo를 보고....지금 막 한번 해봐야 겠다는 생각이 들어서 테스트 겸 저도 한번 따라해 봤습니다.

그리고 제가 기억력이 좋은게 아니라서 이렇게 몇자 적어 두어서 기억을 되세기려고 합니다.^^;;

 

저는 다운로드를 알집으로 한번도 테스트를 해본적이 없어서...근데...그날 서동진님의 세션을 듣고

이미지를 하나하나 내려주는 것보다는 알집을 이용해서 내려보내는 게 아주 효과적이라는 사실을

알았습니다. , 이미지를 하나하나 서버에 연결을 해서 다운로드 하는 것보다 한번에 파일을 내려보

내는 것이 효과적 이겠고, 용량을 압축해서 내려 보내기때문에 하나하나 내려보내서 다 받는 시간보다

한번에 압축해서 받는 시간이 반이상이나 차이가 겠지요~^^(차이가 나더라고요~!)

그 전에는 그렇게 생각해 본적이 없었던 저 한테는 새로운 발견이었습니다~^^;;;

 

그럼 한번 코드를 살짝 보도록 하겠습니다.

저는 아래와 같이 Silverlight 프로젝트와 Web 프로젝트를 하나씩 만들었습니다.

 

1.그림

 

사용자 삽입 이미지

 

위 그림은 솔루션 탐색기로 제가 만든 Silverlight 프로젝트와 Web프로젝트의 생성 모습입니다.

그리고 images.zip 라는 알집 파일이 있는 것을 볼 수 있습니다. 이 파일은 Web프로젝트에 생성이

되어 있어야 합니다. 그래야 Silverlight로 다운로드 할 수 있기 때문입니다.

 

images.zip 파일에는 아래와 같은 image파일들이 들어 있습니다.

 

2.그림

 

사용자 삽입 이미지

 

 

그럼 코드를 보도록 하겠습니다. 아주 간단합니다. Downloader클래스를 사용했보셨다면 금방 이해

하실 겁니다. 실은 모 별거 없습니다.ㅋㅋ 이 내용은 그냥 제가 기억하기 위해서 포스팅하는 것이니

혹시 읽다가 아시는 내용이면 안보셔도 괜찮습니다~^^;;;;;

 

///////////////////////////////////////////////////////////////////////////////////////////

using System.Windows.Browser;

 

namespace ImageZipTest01

{

    public partial class Page : Canvas

    {

        private Image img;

        //위치 지정을 위한 변수

        private int _left = 20;

        public void Page_Loaded(object o, EventArgs e)

        {

            // Required to initialize variables

            InitializeComponent();

 

            Downloader DL = new Downloader();

            DL.Completed += new EventHandler(DL_Completed);

            DL.Open("GET", new Uri(HtmlPage.DocumentUri, "images.zip"));

            DL.Send();

        }

 

        void DL_Completed(object sender, EventArgs e)

        {

            var URL = sender as Downloader;

            for (int i = 0; i < 2; i++)

            {

                img = new Image();

                img.SetSource(URL, string.Format("img0{0}.jpg",i));

                img.Width = 320;

                img.Height = 400;

                img.SetValue<int>(LeftProperty, _left);

                this.Children.Add(img);

                _left += 340;

            }

        }

    }

}

///////////////////////////////////////////////////////////////////////////////////////////

 

위 코드는 보시듯 아주 간단 합니다.^^;; Silverlight 프로젝트의 Page.xaml 비하인드 코드에 작성한

코드이고요~ 그래도 이 간단한 소스를 설명하자면...변수로 Image클래스를 선언하고 이미지의 위치

위치를 변경하기 위해 int형 변수를 선언했습니다. Page_Loaded이벤트 부분에는 Downloader 클래

스를 생성하고, 이벤트...(다운로드가 끝나고 일어나는 이벤트)Completed 를 선언했습니다. 그리고

Open 메소드를 통해서 전송방식과 다운로드의 대상 경로를 지정했습니다. 그 다음 Send 메소드를

통해서 다운로드 실행한 것이지요~

이벤트 부분의 코드는 다운로드가 완료 되면 반복문을이용해서 image 객체를 생성하는 것입니다.

이벤트의 인자같으로 받는 sender는 다운로드클래스 이기 때문에 sender를 이용해서 Downloader

클래스를 생성하고 Image객체의 SetSource 지정합니다.  SetSource의 첫번째 인자값은 다운로드

클래스이고, 두번째는 파일 이름이 되겠네요~^^

 

자 이렇게 하면 어떻게 프로젝트가 실행이 될지 예상이 되겠지요~^^

아래는 프로젝트를 빌드하고 실행한 모습입니다.

 

3.그림

 

사용자 삽입 이미지

 

오호 이렇게 잘나오네요~^^

이미지를 하나하나하나 다운로드해도  이렇게 똑같이 나타날 것입니다.

프로젝트의 성향에 따라 한꺼번에 받을 것인지 아니면 하나하나하나 받아야 하는지를...잘 생각해보고

사용하면 유용할 것 같습니다~

 

이제 크리스마스 이브군요~^^;;;;

메리 크리스마스.....2007 12 24.....^^;;

 

Posted by happydong
, |



 GDI+ 이미지 다루기

 

 GDI+을 이용해서 이미지를 만들기도 하지만, 기존의 이미지 파일을 불러다가 그릴 수도 있고, 가공

할 수도 있다.

 

 Image 클래스는 픽셀 단위를 표현하기 위한 정보를 다루는 많은 메서드와 속성들을 정의하고 있다.

Width, Height, Size 속성은 이미지의 치수정보를 얻을 수 있으며, 팔레트를 다룰 수 있는 속성도 지원

하고 있다.

 System.Drawing.Imaging 네임스페이스는 이미지를 변형시키는데 도와주는 많은 클래스들을 정의

하고 있다.

 

저장된 파일을 이미지를 불러와 그리려면 Graphics객체의 DrawImage 메소드를 이용하면 된다.

DrawImage 메소드는 여러 개의 오버로드를 지원한다아래는 몇가지 오버로드를 확인 한 것이다.

 

//////////////////////////////////////////////////////////////////////////////////////////

# 이미지를 불러서 원본의 크기대로 지정한 좌표로 그려주는 형식

 

DrawImage(Image image, int x, int y);

 

 - image : 그리고자 하는 Image 객체

 - x : 그리려는 이미지의 왼쪽 위 모서리 X 좌표

 - y : 그리려는 이미지의 왼쪽 위 모서리 Y 좌표

 

//////////////////////////////////////////////////////////////////////////////////////////

# 지정한 좌표에 지정한 크기로 그려주는 형식

 

DrawImage(Image image, int x, int y, int width, int height);

 

- image : 그리고자 하는 Image 객체

- x : 그려지는 이미지의 왼쪽 위 모서리의 X 좌표

- y : 그려지는 이미지의 왼쪽 위 모서리의 Y 좌표

- Width : 그려지는 이미지 너비

- Height : 그려지는 이미지의 높이

 

//////////////////////////////////////////////////////////////////////////////////////////

# 지정된 Image 객체의 일정 부분을 설정한 크기로 그려주는 형식

 

DrawImage(Image image, Rectangle destRect, Rectagle srcRect, GraphicsUnit srcUint);

 

- image : 그리고자 하는 Image 객체

- destRect : 그려지는 이미지의 위치와 크기를 지정하는 Rectangle 구조체

  (이미지는 사각형에 맞추기 위해 크기가 조정되므로 주의하여야 함.)

- srcRect : 그릴 image 객체의 부분을 지정하는 Rectangle 구조체

- srcUnit : srcRect 매개 변수가 사용하는 측정 단위를 지정, GraphicsUnit 열거형 멤버

 

//////////////////////////////////////////////////////////////////////////////////////////

 

다음은 간단한 예제 이다.

 

 VS2005WinForm 프로젝트를 만든다. 그리고 나서 Paint 이벤트를 더블 클릭해서 이벤트를 생성

한다. (Paint 이벤트 : 컨트롤을 다시 그려야 할 때 발생합니다.) 그리고 아래 코드를 작성한다.

 

//////////////////////////////////////////////////////////////////////////////////////////

private void Form1_Paint(object sender, PaintEventArgs e)

{

// img01.jpg 파일로부터Bitmap 객체를생성한다.

Bitmap _imgbitmap = new Bitmap("img01.jpg");

// Graphics 객체를생성

Graphics _graphics = this.CreateGraphics();

//좌표, 10 에서시작하여생성된Bitmap 객체를그린다.

_graphics.DrawImage(_imgbitmap, 10, 10);

}

//////////////////////////////////////////////////////////////////////////////////////////

참고로 img01.jpg 파일을 프로젝트 생성한 bin폴더안에 Debug폴더안에 위치되어 있다.

아래 그림은 프로젝트 실행모습이다.

 

1. 그림

 

사용자 삽입 이미지

 

Paint 이벤트 이해

 

Paint 이벤트는 컨트롤을 다시 그리면 발생하는 이벤트 이다. 다시 그려진다는 의미는 프로그램에 의

해 가려 줬다가 다시 보일때, 프로그램 우측 상단에 보면 최소화, 최대화 버튼으로 인해 프로그램이

숨겨졌다가 다시 활성화 될 때 일어나는 이벤트 이다.

 

 아래는 실행 화면은 버튼을 생성하고 버튼의 Click 이벤트 부분에 위에서 작성한 코드를 넣고, Paint

이벤트 부분의 코드를 주석처리로 했다. 그럼 버튼을 클릭하면 이미지가 그려질 것 이다.

 

2. 그림 (실행 화면)

 

사용자 삽입 이미지

 

3.그림(버튼 클리으로 이미지 그림)

 

사용자 삽입 이미지

 

4. 그림(이미지 그린후 메모장 실행 이미지 겹친모습)

 

사용자 삽입 이미지

 

5.그림( 겹쳐진 메모장을 이동한 모습)

 

사용자 삽입 이미지

 

위에서 말했듯이 최대화 ,최소화 버튼을 클릭했을 때도 이미지가 사라지는 모습을 볼 수 있을 것이다.

한번 만들어 보고 실험해 보길 바란다.

 

 

 

- 참고 서적 : C# 게임 프로그래밍 -

 

Posted by happydong
, |



ㅁ GDI+ 모양 그리기


선은 Graphics 객체에서 Draw로 시작하는 메소드를 통해 그릴수 있고, Graphics 객체의 메소드들 을 보면 Fill로 시작하는 메소드들은 도형을 그리고 그 도형 안에 색을 채워 주는 메소드로 Brush 객체를 매개변수로 사용 한다.

※ Graphics 클래스의 모양 그리기(채우기) 메소드

 메소드

 설명

 FillClosedCurve  Point 구조체의 배열에 의해 정의된 닫힌 카디널 스플라인의 내부를 채운다.
 FillEllipse  좌표, 너비, 높이의 쌍으로 지정된 경계 사각형에 의해 정의되는 타원의 내부를 채운다.
 FillPath  GraphicsPath 개체의 내부를 채운다.
 FillPie  좌표 쌍, 너비, 높이, 및 두 개의 방사형 선에 의해 지정된 타원에 의해 정의되는 부채꼴 섹션의 내부를 채운다.
 FillPolygon  Point 구조체에 의해 지정된 점의 배열에 의해 정의되는 다각형의 내부를 채운다.
 FillRectangle  좌표 쌍, 너비 및 높이로 지정된 사각형의 내부에 의해 정의되는 사각형의 내부를 채운다.
 FillRectangles  Rectangle 구조체에 의해 지정된 일련의 사각형의 내부를 채운다.
 FillRegion  Region 개체의 내부를 채운다.

아래 참고 예제는 WinForm 프로젝트로 확인한 예제이다.

1.그림

사용자 삽입 이미지


위 그림은 Form 위에 Button 컨트롤 6개를 올려둔 모습이며, 이 예제에서는 각각의 버튼을
클릭하면 원하는 도형이 그려지도록 하는 예제이다.
아래는 코드는 각각의 Button 이벤트에서 일어나는 행위들을 정의한 것이다.

//////////////////////////////////////////////////////////////////////////////////////////

// 추가

using System.Drawing.Drawing2D;

 

// 사각형그리기버튼이벤트

private void btn_Rectangle_Click(object sender, EventArgs e)

{

            // Graphics 객체를생성한다.

            Graphics _graphics = this.CreateGraphics();

            // 메인폼의Graphics 객체를통해바탕화면을희색으로Clear한다.

            _graphics.Clear(Color.White);

 

            // 검은색Pen 객체를생성한다.

            Pen _pen = new Pen(Color.Black);

            // 검은색펜을통해사각형선을그린다.

            _graphics.DrawRectangle(_pen, 10, 10, 320, 165);

 

            // 노란색SolidBrush 객체를생성한다.

            SolidBrush _brush = new SolidBrush(Color.Yellow);

            // 노란색으로채워진사각형을그린다.

            _graphics.FillRectangle(_brush, 10, 180, 320, 165);

}

 

// 원그리기버튼이벤트

private void btn_Ellipse_Click(object sender, EventArgs e)

{

            // Graphics 객체를생성후폼을희색으로Clear 한다.

            Graphics _graphics = this.CreateGraphics();

            _graphics.Clear(Color.White);

 

            // 검은색Pen 객체생성

            Pen _pen = new Pen(Color.Black);

            // 검은색펜으로원선을그린다.

            _graphics.DrawEllipse(_pen, 10, 10, 320, 165);

 

            //토마토색SolidBrush 객체를생성후원안의색을채운다.

            SolidBrush _brush = new SolidBrush(Color.Tomato);

            _graphics.FillEllipse(_brush, 10, 180, 320, 165);

}

 

// 삼각형그리기버튼이벤트

private void btn_Polygon_Click(object sender, EventArgs e)

{

            // Graphics 객체를생성후폼을희색으로Clear 한다.

            Graphics _graphics = this.CreateGraphics();

            _graphics.Clear(Color.White);

 

            // 검은색Pen 객체생성

            Pen _pen = new Pen(Color.Black);

            //삼각형을그리기위한포인트배열을생성한다.

            Point[] _point01 = new Point[]{

                new Point(175,10), new Point(10,165), new Point(340,165)

};

            //검은색펜으로다각형선을그린다.

            _graphics.DrawPolygon(_pen, _point01);

 

            // 은색SolidBrush 객체를생성후다각형안을채운다.

            SolidBrush _brush = new SolidBrush(Color.Silver);

            Point[] _point02 = new Point[]{

                new Point(10,175), new Point(175,340), new Point(340,175)

            };

            _graphics.FillPolygon(_brush, _point02);

}

 

// Hatch Style 버튼이벤트

private void btn_Hatch_Click(object sender, EventArgs e)

{

            // Graphics 객체를생성후폼을희색으로Clear 한다.

            Graphics _graphics = this.CreateGraphics();

            _graphics.Clear(Color.White);

 

            // Hatch Style을그리기위해offSet 정수형변수를생성한다.

            int offSet = 10;

            // HatchStyle 타입의열거형값들을받아Array Object 객체를생성한다.

            // HatchStyle 타입의열거형생성하려면using문추가System.Drawing.Drawing2D;

            Array obj = Enum.GetValues(typeof(HatchStyle));

            // HatchStyle 열거형값이많아10개의값만출력할수있도록반복문생성한다.

            for (int i = 0; i <= 10; i++)

            {

                // i번째HatchStyle 열거형값의HatchStyle 객체를생성한다.

                HatchStyle h_Style = (HatchStyle)obj.GetValue(i);

                /* 생성된Hatchstyle 객체를통해HatchBrush 객체

                 희색전경색에검은색배경색으로생성한다. */

                HatchBrush H_brush = new HatchBrush(h_Style, Color.White, Color.Black);

                // HatchStyle 객체의값이름을DrawString 메소드를통해그린다.

                _graphics.DrawString(h_Style.ToString(), new Font("굴림체", 10), new SolidBrush(Color.Black), 0, offSet);

                // 생성된HatchBrush 객체의브러시를통해채워진사각형을그린다.

                _graphics.FillRectangle(H_brush, 140, offSet, 200, 20);

                // 다음객체를그리기위해좌표를offSet 변수를통해재설정한다.

                offSet += 30;

            }

}

 

// Texture 버튼이벤트

private void btn_Texture_Click(object sender, EventArgs e)

{

            /* bgimage.bmp파일과txtimage.bmp 파일을해당프로젝트에

             bin폴더안에Debug폴더안에넣어두었다.*/

 

            // 백그라운드이미지객체를생성한다.

            Image _bgimg = new Bitmap("bgimage.bmp");

            // 생성한이미지객체를통해TextureBrush 객체를생성한다.

            TextureBrush txtbgbrush = new TextureBrush(_bgimg);

 

            // 텍스트이미지객체를생성한다.

            Image txtimg = new Bitmap("txtimage.bmp");

            // 생성한이미지객체를통해TextureBrush 객체를생성한다.

            TextureBrush txtbrush = new TextureBrush(txtimg);

 

            // Graphics 객체를생성후폼을희색으로Clear 한다.

            Graphics _graphics = this.CreateGraphics();

            _graphics.Clear(Color.White);

 

            /* 백그라운드이미지를통해생성된TextureBrush 객체를통해

             현재폼을이미지로채운다.*/

            _graphics.FillRectangle(txtbgbrush, this.ClientRectangle);

            // 텍스트에이미지를입혀서그린다.

            _graphics.DrawString("Texture Brush~!", new Font("굴림체", 60, FontStyle.Bold | FontStyle.Italic), txtbrush, this.ClientRectangle);

}

 

// Gradient 버튼이벤트

private void btn_Gradient_Click(object sender, EventArgs e)

{

            // Graphics 객체를생성후폼을희색으로Clear 한다.

            Graphics _graphics = this.CreateGraphics();

            _graphics.Clear(Color.White);

 

            int offSet = 10;

            /* 그라데이션브러시를생성하기위해비워있는

              LinearGradientBrush 객체를생성한다. */

            LinearGradientBrush Lbrush = null;

            Rectangle _rectangle = new Rectangle(0, 0, 100, 100);

            // LinearGradientMode 타입의열거형값을Array 객체로생성한다.

            Array obj = Enum.GetValues(typeof(LinearGradientMode));

 

            // LinearGradientMode 타입의열거형값을출력하기위해반복문생성한다.

            for (int i = 0; i < obj.Length; i++)

            {

                // i 번째LinearGradientMode 객체의열거형값객체를생성한다.

                LinearGradientMode lgMode = (LinearGradientMode)obj.GetValue(i);

                /* 생성된LinearGradientMode 객체를통해LinearGradientBrush 객체를

                   빨강색과파랑색을혼합하여생성한다. */

                Lbrush = new LinearGradientBrush(_rectangle, Color.Red, Color.Blue, lgMode);

                // LinearGradientMode 객체의열거형값이름을그린다.

                _graphics.DrawString(lgMode.ToString(), new Font("굴림체", 10), new SolidBrush(Color.Black), 0, offSet);

                // 생성된LinearGradientBrush 객체의브러시를통해채워진사각형그린다.

                _graphics.FillRectangle(Lbrush, 140, offSet, 200, 50);

                // 다음객체를그리기위해좌표를offSet 변수를통해재설정한다.

                offSet += 80;

            }

}

//////////////////////////////////////////////////////////////////////////////////////////


아래 그림은 결과 화면이다.


2. 그림 (사각형)

사용자 삽입 이미지


3.그림(원)

사용자 삽입 이미지


4.그림 (삼각형)

사용자 삽입 이미지


5.그림 (Hatch Style)

사용자 삽입 이미지


6.그림(Texture)

사용자 삽입 이미지


7.그림(Gradient)

사용자 삽입 이미지




- 참고 서적 : C# 게임 프로그래밍 -





Posted by happydong
, |