스크린샷
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);
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 이미지 영역을 얻으려면 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 이미지를 창에 그릴 수 있지만 반투명 문제로 인해 먼저 투명 브러시로 창을 채운 후 그려야 합니다.
그런데 또 다른 문제가 있습니다. 비클라이언트 영역 윈도우 그리기는 이전 그림과 마찬가지로 모두 윈도우 클라이언트 영역에 그려집니다.