C# GDI+ 프로그래밍 (4)

高洛峰
풀어 주다: 2016-12-17 10:11:53
원래의
1313명이 탐색했습니다.

스크린샷
Grahpics 클래스의 CopyFromScreen 함수는 화면을 Graphics 개체에 복사할 수 있습니다. Graphics 객체가 윈도우 Form에서 생성되면 화면이 윈도우에 바로
표시됩니다. 예제를 살펴보세요. 창에 버튼을 추가한 다음 버튼에 클릭 이벤트 핸들러를 추가합니다.
함수에 포함된 코드는 다음과 같습니다.
private void 버튼1_Click(object sender, EventArgs e)
{
this.CreateGraphics().CopyFromScreen(50,50, 0, 0, this. Size,CopyPixelOperation .SourceCopy);
}
첫 번째 매개변수와 두 번째 매개변수는 화면에서 복사를 시작할 위치를 나타내며, 다음 0,0은 창의 어디부터 시작하여 화면을 창에 복사한다는 의미입니다. 보여주다.
this.Size는 복사할 크기(너비와 높이)입니다.

은 VC++에 있습니다. 이것은 단지 말하는 방식이 다를 뿐입니다. 최종 결과는 여전히 동일합니다.

이전의 Graphics 객체 생성은 모두 창을 통해 이루어졌는데, 이번에는 그림 위에 그림을 그릴 수 있도록 Graphics 객체를 생성합니다.
이미지 개체 생성이 파일을 로드하는 유일한 방법은 아닙니다. 생성자를 통해 "빈" 비트맵을 만들 수 있습니다. 이 비트맵에는 특정 데이터가 없거나 그 안에 있는 기본 데이터는 쓸모가 없습니다. 내부를 그리고 데이터를 추가합니다.


예: 스크린샷을 찍어 이미지를 파일로 저장
private void 버튼1_Click(object sender, EventArgs e)
{
//비트맵 이미지 생성, 너비 800 , 높이 600, 정말 큰 컨테이너입니다.
Bitmap bmp = new Bitmap(800, 600);
//이미지에서 Grahpics 객체 생성
Graphics gr = Graphics.FromImage(bmp);
//화면을 Bitmap으로 복사
gr.CopyFromScreen(0, 0, 0, 0, new Size(800, 600), CopyPixelOperation.SourceCopy);
//이미지 파일로 저장
bmp.Save("d:\screen.jpg ") ;
}
어때요? 충분히 간단합니다. 스크린샷을 찍고 파일로 저장하려면 4줄의 코드가 필요합니다. VC++에는 많은 코드 줄이 필요합니다. 또한 Bitmap은 Image 클래스에서 파생됩니다.

이중 버퍼링 일회성 그리기
이중 버퍼링을 사용하지 않은 예를 살펴보겠습니다. 창 내에서 마우스가 움직일 때 왼쪽 상단의 사각형에 마우스의 현재 위치가 표시됩니다.
공개 부분 클래스 Form1: Form
{
public Form1()
{
InitializeComponent();
this.MouseMove += formMouseMove;
}
private void formMouseMove(객체 전송자, MouseEventArgs e)
                                                                                                                                                                                 누구' 누구' 누구' 직사각형,         LinearGradientBrush =
new entBrush(직사각형, Color.FromArgb(44, 55, 66), Color.FromArgb(123, 150, 189),
LinearGradientMode.Horizontal);
gr.FillRectangle(brush, ect);
                 // 직사각형 그리기
Pen pen = new Pen(Color.Green, 2);
gr.DrawRectangle(pen, ret);
//텍스트 표시
gr.TextRenderingH int = System.드로잉.Text.TextRenderingHint.AntiAlias;
String str = String.Format("마우스 위치:n{0},{1} ", e.X, e.Y);
gr.DrawString(str, new Font("黑体", 11 ),Brushes.White, ret);
}
}
보시다시피, 마우스가 움직이면 왼쪽 위 모서리에 있는 직사각형이 분명히 깜박입니다. 이는 3번의 그리기, 직사각형 채우기, 텍스트를 표시하는 직사각형 그리기 때문입니다. 그것이 원인이었습니다.
더 많이 그릴수록 깜박임이 더욱 분명해집니다.
그리고 이 세 가지 그림은 결국 하나의 결과, 즉 그림만 얻으면 됩니다. 그러면 이중 버퍼링을 사용하여 먼저 비트맵에 그릴 그래픽을 그릴 수 있습니다. 그런 다음 창에 비트맵을 그립니다.
예제를 보세요:
private void formMouseMove(object sender, MouseEventArgs e)
{
Graphics Graphics = this.CreateGraphics();
//비트맵에서 그래픽 객체 생성
           Bitmap bmp=new Bitmap(100,35);
            Graphics gr = Graphics.FromImage(bmp);  
          Rectangle ect = new Rectangle(0, 0, 100, 35);                           직사각형
LinearGradientBrush 브러시 = //사각형 그리기
펜 pen = new Pen(Color.Green, 2);
gr.DrawRectangle(pen, ect);
//텍스트 표시
gr.TextRenderingHint = System.드로잉.Text.TextRenderingHint.AntiA lias;
String str = String.Format("마우스 위치:n{0},{1}", e.X, e.Y);
gr.DrawString(str, new Font("黑体", 11),Brushes. White , RECT);

// Draw

Graphics.DrawImage (BMP, 0, 0)
}

비트맵 가져오기

Drawtobitmap 창이나 컨트롤의 모양을 비트맵으로 표시합니다. Control 클래스에 속하며, 윈도우 클래스와 컨트롤 클래스 모두 Control 클래스에서 파생됩니다.
예제 보기: (버튼 클릭 이벤트 핸들러 함수의 코드)
private void 버튼1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(Width, Height);
this.DrawToBitmap(bmp, new Rectangle(0, 0, Width, Height));
bmp.Save("d:\form.jpg");
}
DrawToBitmap의 두 번째 매개변수 , 는 비트맵에 표시되는 창의 영역입니다. 이 이미지는 축소하거나 확대할 수 없습니다.
창의 크기를 10, 10, 50, 50으로 채우면 창의 크기가 0, 0, 50, 50이 됩니다. 비트맵의 10에 표시됩니다. 10, 50, 50 직사각형 영역 내에서는 창의 시작 위치를 지정할 수 없습니다. 0, 0 위치에서만 시작할 수 있습니다.

픽셀 값 가져오기

Bitmap 클래스의 GetPixel 함수는 픽셀의 색상 값을 가져올 수 있습니다. 창에서 픽셀의 색상 값을 가져오려면 먼저 호출하면 됩니다. DrawToBitmap 함수를 실행하고
Window를 넣으면 비트맵으로 저장됩니다. 그런 다음 다시 얻으십시오. 또 다른: 픽셀의 색상 값을 설정하는 해당 함수 SetPixel도 있습니다.

Png 이미지 표시 영역을 가져와 불규칙한 창을 만듭니다.

Png 이미지 영역을 얻으려면 GetPixel 함수를 사용하여 이미지의 각 픽셀의 색상 값을 얻을 수 있습니다. 알파 값이 0이면 투명하고, 그렇지 않으면 이 점을 영역에 추가합니다. 그러면 Color 개체의 Alpha 값을 얻는 방법은 무엇입니까? ToArgb 멤버 함수를 호출하면 4개의 8비트 값(A, R, G, B)만 저장할 수 있습니다.
예제를 보고 알파 값 추출
{
Color cor1 = Color.FromArgb(123,225,229,230);
//Color의 argb 값 가져오기
int argb = cor2.ToArgb( );
//문자 배열로 변환
byte[] bargb = BitConverter.GetBytes(argb);
//bargb[3]은 Alpha 값을 저장합니다
String str = String.Format( " {0},{1},{2},{3}", bargb[0], bargb[1], bargb[2], bargb[3]);
MessageBox.Show(str);
}
완전한 예, PNG 표시 영역 가져오기

샘플 코드:

public Form1()
{
InitializeComponent();
                    //PNG 이미지 로드 Bitmap BMP = New Bitmap ("D: \ Image \ Win.png")
// 각 픽셀의 색상 값을 결정하고 그림의 표시 영역을 얻습니다.
for (int y = 0; y & lt ; bmp.Height; y++)
for (int x = 0; x < bmp.Width; x++)
{
GetPixel(x, y);
int argb = cor.ToArgb();
                                     | 0)
                                                                  
                               // 이 픽셀 영역 추가 경로로                                                                                  }
                                                                     지역 표시, 경로를 통해 지역 생성
this.Region = new Region(path);
}

그러나 이 방법은 PNG 이미지의 일부 픽셀의 색상 값이 반투명한 경우에는 약간 신뢰할 수 없으므로 원하는 모양을 얻을 수 없습니다. PNG 이미지의 일부가 투명한 것처럼 보이지만.
해결책은 PNG 이미지를 직접 만들고 자신만의 규칙을 따르는 것입니다. 온라인에서 찾지 마세요.

불규칙한 창을 설정한 후 PNG 이미지를 창에 그릴 수 있지만 반투명 문제로 인해 먼저 투명 브러시로 창을 채운 후 그려야 합니다.

그런데 또 다른 문제가 있습니다. 비클라이언트 영역 윈도우 그리기는 이전 그림과 마찬가지로 모두 윈도우 클라이언트 영역에 그려집니다.

그리려는 그림이 창에 해당하는 경우 반드시 비클라이언트 영역에서 그려야 합니다. 이를 수행하는 방법. 다음 장에서 그것에 대해 이야기합시다.


더 많은 C# GDI+ 프로그래밍(4) 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!