ColorMatrix 상세 설명

ColorMatrix (색채 행렬) 는 GDI + 에서 그림 의 색 채 를 조절 하 는 행렬 입 니 다.  행렬 이 무엇 인지 말하자면 C \ # 의 2 차원 배열 이다.  그렇다면 이 행렬 이 색 채 를 조정 하 는 원 리 는 무엇 입 니까? 그 는 어떻게 색 채 를 조정 합 니까?이것 은 선형 대수 안의 행렬 을 곱 해서 말 해 야 한다.  다음 단락 에서 선형 대 수 를 배 운 독 자 는 뛰 어 넘 을 수 있다. 여기 서 나 는 자신의 이해 로 행렬 의 상승 알고리즘 과 결 과 를 묘사 할 수 있다.선형 대수 에서 두 행렬 이 곱 하면 이렇게 계산 된다.  A 행렬 에 B 행렬 을 곱 하면 행렬 C 를 새로 생 성 합 니 다. C 의 N 줄 M 열 요 소 는 A 의 N 줄 과 B 의 M 열 이 요소 마다 곱 하 는 것 과 같 습 니 다.새로 생 성 된 행렬 줄 수 는 A 의 줄 수 와 같 고 열 수 는 B 의 열 수 와 같다.  또한 A 와 B 는 만족 해 야 하고 A 의 열 수 는 B 의 줄 수 와 같다.이것 은 바로 A 의 모든 줄 에 있 는 모든 요소 가 B 의 모든 열 에 있 는 모든 요 소 를 곱 할 수 있다 는 것 을 보장 하기 위해 서 이다.  즉 A [m, n] X B [n, p] = C [m, p]  직관 적 인 묘사 에서 행렬 A [2, 3] 가 있다.  {  1,2,3  4,5,6  }  행렬 B [3, 2]  {  7 , 8  9 , 10  11, 12  }  그러면 곱 하기 후 새 행렬 C 생 성 [2, 2]  {  1*7+2*9+3*11,1*8+2*10+3*12  4*7+5*9+6*11,4*8+5*10+6*12  }  자, 행렬 의 개념 은 여기까지 입 니 다. 다음은 GDI + 의 색채 행렬 을 말씀 드 리 겠 습 니 다. 컴퓨터 에 서 는 한 장의 그림 을 점 의 집합 으로 볼 수 있 습 니 다. 그림 은 넓 고 높 은 개념 이 있 지만 2 차원 으로 보 입 니 다. 사실 처리 할 때 우 리 는 넓 고 높 은 것 을 그림 의 속성 으로 볼 수 있 습 니 다. 점 과 상 관 없 이 그림 의 모든 점 을 1 차원 배열 로 볼 수 있 습 니 다.  점 자 체 는 빨간색 과 파란색 의 집합 이다. 지금 계산 도형 에 알파 값 (투명 도 를 나타 내 는 것) 을 하나 더 넣 으 면 4 개의 속성의 집합 이다. 이런 그림 은 2 차원 의 배열, 즉 표준 행렬 이 된다.  그러면 4 개의 점 의 그림 을 행렬 로 묘사 하면 P [4, 4] 이다.  {  R1,G1,B1,A1  R2,G2,B2,A2  R3,G3,B3,A3  R4,G4,B4,A4  }  우리 가 이 행렬 과 다른 4X4 행렬 M 을  {  rr,gr,br,ar  rg,gg,bg,ag  rb,gb,bb,ab  ra,ga,ba,aa  }  곱 하면 새로운 행렬 이 생 성 됩 니 다. 새로운 행렬 은 원래 의 행렬 요소 와 수량 이 같 습 니 다. (믿 지 않 으 면 [5, 4], [6, 4] 행렬 과 그것 을 곱 해 볼 수 있 습 니 다) 그리고 새로운 행렬 의 모든 요 소 는 재 미 있 는 변화 가 생 겼 습 니 다. 결 과 를 살 펴 보 겠 습 니 다. 새로운 행렬 NP:  {  R1*rr+G1*rg+B1*rb+A1*ra,R1*gr+G1*gg+B1*gb+A1*ga,R1*br+G1*rg+B1*bb+A1*ba,R1*ar+G1*ag+B1*ab+A1*aa  ......  ......  ......  }  새로운 행렬 의 첫 줄 (즉, 새로운 그림 의 첫 번 째 점) 의 R, G, B, A 는 모두 원래 그림 의 첫 번 째 점 의 모든 RGBA 의 새로운 혼합 값 과 같다. 즉, 행렬 을 곱 하면 그림 의 원래 의 기초 위 에서 새로운 그림 의 RGBA 각 분량 의 값 을 바 꿀 수 있다 는 것 이다.  또한 내 가 왜 M 매트릭스 의 각 요 소 를 이렇게 명명 하 는 지 알 수 있다. rr 는 새로 생 성 된 R 분량 중원 R 분량 의 비율 을 나타 내 고, gr 은 새로 생 성 된 G 분량 중원 R 분량 의 비율 을 나타 내 며, br 는 새로 생 성 된 B 분량 중원 R 분량 의 비율 을 나타 낸다. 이런 유추 에 의 하면 GDI + 에서 ColorMatrix 는 4X4 의 행렬 이 아니 라 5X5 의 행렬 인 데, 왜 그 럴 수 있 는 지 알 수 있다.한 줄 과 한 열 이 더 나 오 네요.  NP 를 살 펴 보 겠 습 니 다. 그의 첫 번 째 요 소 는 R1 * rr + G1 * rg + B1 * rb + A1 * ra 입 니 다. 무엇 을 알 아 보 셨 습 니까? 그것 은 바로 3 개의 원소 의 덧셈 만 할 수 있 고 마이너스 연산 을 할 수 없습니다. 즉, 제 가 R1 의 반 색 연산 을 하고 싶다 면 (255 로 원래 의 값 을 뺀)할 수 없 기 때문에 GDI + 는 원래 의 기초 위 에서 1 차원, 가상의 1 차원 W 를 확장 했다. 이런 점 은 R, G, B, A, W 가 되 었 다. 이 많이 나 온 W 는 평소에 존재 하지 않 고 색채 행렬 을 연산 할 때 만 보조 적 인 역할 을 한다. 기본 값 은 255 이다.  1 차원 W 를 넣 은 후 NP 의 첫 번 째 원 소 를 본 결과  R1*rr+G1*rg+B1*rb+A1*ra+W1*rw  이렇게 rw 를 1, rr 를 - 1, 기타 0 으로 설정 하면 결 과 는 255 - R1 입 니 다. 어 떻 습 니까? 반 색 연산 이 완 성 될 수 있 습 니 다.
 
ImageAttributes 클래스 는 그림 을 보 여 주 는 과정 에서 수정 할 수 있 는 많은 속성 을 가지 고 있 습 니 다. 아래 예제 에서 ImageAttributes 대상 은 모든 알파 값 을 원래 의 80% 로 설정 하 는 데 사 용 됩 니 다. 이것 은 하나의 색상 행렬 을 초기 화하 고 행렬 의 알파 크기 를 0.8 로 설정 함으로써 이 루어 집 니 다. 색상 행렬 의 주 소 는 ImageAttributes 대상 의 SetColorM 에 전 달 됩 니 다.atrix 방법, ImageAttributes 대상 이 Graphics 대상 에 게 전달 하 는 DrawString 방법.
// Create a Bitmap object and load it with the texture image.
Bitmap bitmap(L"Texture1.jpg");
Pen pen(Color(255, 0, 0, 0), 25);
// Initialize the color matrix.
// Notice the value 0.8 in row 4, column 4.
ColorMatrix colorMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.8f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt;
imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
// First draw a wide black line.
graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));
// Now draw the semitransparent bitmap image.
INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
graphics.DrawImage(
   &bitmap, 
   Rect(30, 0, iWidth, iHeight),  // Destination rectangle
   0,                             // Source rectangle X 
   0,                             // Source rectangle Y
   iWidth,                        // Source rectangle width
   iHeight,                       // Source rectangle height
   UnitPixel, 
   &imageAtt);
// Create a Bitmap object and load it with the texture image.
Bitmap bitmap(L"Texture1.jpg");
Pen pen(Color(255, 0, 0, 0), 25);
// Initialize the color matrix.
// Notice the value 0.8 in row 4, column 4.
ColorMatrix colorMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.8f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt;
imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
// First draw a wide black line.
graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));
// Now draw the semitransparent bitmap image.
INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
graphics.DrawImage(
   &bitmap, 
   Rect(30, 0, iWidth, iHeight),  // Destination rectangle
   0,                             // Source rectangle X 
   0,                             // Source rectangle Y
   iWidth,                        // Source rectangle width
   iHeight,                       // Source rectangle height
   UnitPixel, 
   &imageAtt);

보 여 주 는 과정 에서 비트 맵 의 각 알파 값 은 원본 값 의 80% 로 바 뀌 어 배경 과 혼 합 된 그림 을 만 들 수 있 습 니 다. 아래 삽화 에서 보 여 준 것 처럼 비트 맵 그림 은 투명 해 보 입 니 다. 순수한 검 은 선 을 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기