2014-01-13 2 views
1

입니다. 딜레마가 있습니다. 언뜻보기에 내 작업은 간단하지만 충분히 어려움이 있습니다. 나는 이미지가있다. 회색 이미지입니다. 그리고 컬러 이미지를 얻을 필요가 있습니다. 그림이 가장 잘 보여줍니다. 1) 색조를 변경 2) 색상을 변경 (그레이 이미지의 색상을 변경하는 가장 좋은 방법은 C#

색조는 일반적인 색상도 검은 색을 변경) 컬러 매트릭스 회전 :

나는이 작업을 수행하는 두 가지 방법을 알고있다. 그래서 나는이 방법이 내 경우에는 적합하지 않다고 믿는다.

색조를 바꾸려면 기본 이미지가 이미 채색되어 있어야하지만 모든 이미지는 처음에는 회색 (그라디언트)입니다. 그러나 필요한만큼 잘 작동합니다.

그래서이 문제를 해결하는 방법에 대해 다소 혼란스러워합니다.

내가 할 일을 수행하는 다른 방법이있을 수 있습니까?

여러분의 도움에 감사드립니다. 미리 감사드립니다. 이것은 ↑

유사 ↑ this is a base image

가 I는 계조에 전달하는 코드를 기록한 tinted image

+0

불분명 함. 노란색 사진이 좋습니까, 아니면 문제가 있습니까? 오류가있는 경우 사용 된 코드는 무엇입니까? –

+0

RGB의 파란색 부분을 제거하고 싶습니까? – Ralf

+0

* 비슷한 * (두 번째 이미지)를 얻으려면 착색 된 이미지 (세 번째 이미지, 거의 괜찮아요, 다른 색을 시도할까요?)를 수행하고 첫 번째 이미지를 마스킹하는 데 'add'해야합니다. 이미지를 채우고 착색 된 이미지 위에 이러한 검은 색 픽셀 만 넣을 수 있습니다.), 검은 색 사각형과 검은 색 테두리가 있습니다. – Sinatr

답변

0

에서 가져온 결과입니다. 이미지를 혼합 할 색상을 설정할 수 있습니다.

private void ApplyColor(Bitmap bm, Color userColor) 
    { 
     if (bm==null) 
      return; 

     // pixels loop 
     for (int i = 0; i < bm.Width; i++) 
     { 
      for (int j = 0; j < bm.Height; j++) 
      { 
       // get current pixel 
       Color curPix = bm.GetPixel(i, j); 
       Color curPixColor = Color.FromArgb(curPix.A, curPix.R, curPix.G, curPix.B); 

       // get result color by blending 
       Color resultColor = Blend(curPixColor, userColor, ColorMixFactor); 

       // set pixel color 
       bm.SetPixel(i, j, resultColor); 
      } 
     } 
    } 

    public static Color Blend(Color srcColor, Color dstColor, double amount) 
    { 
     // restrict black (dark) color from being affected by the blending 
     var br = srcColor.GetBrightness(); 
     if (br < BrightnessToAvoid) 
      return srcColor; 

     // get all 4 color channels 
     var r = (byte) ((srcColor.R*amount) + dstColor.R*(1 - amount)); 
     var g = (byte) ((srcColor.G*amount) + dstColor.G*(1 - amount)); 
     var b = (byte) ((srcColor.B*amount) + dstColor.B*(1 - amount)); 
     var a = srcColor.A; 

     // get blended color 
     return Color.FromArgb(a, r, g, b); 
    } 
+0

성능 문제가 있습니다. 이 코드는 GetPixel 및 SetPixel 메서드와 관련이 있으며, drankin2112의 게시물에 언급 된 방법으로 해결할 수 있습니다. – yurart

1

↑ 색조 이미지 ↑ this is needed to be achieved

↑ 달성 될 필요 ↑베이스 이미지 노란색과 같은 구성 요소 (R과 G 구성 요소 사이에서 공유 됨) 충분한 결과를 얻었으므로 R 및 G 구성 요소 비율로 재생하여 y 당신이 필요로하는 ellow 색상. 또한 객체의 바닥에서 그림자를 처리하는 방법에 대해 더 많이 검색해야합니다. 여기

// Load image 
Bitmap bm = new Bitmap("D:\\a.png"); 

for (int i = 0; i < bm.Width; i++) 
{ 
    for (int j = 0; j < bm.Height; j++) 
    { 
     // Handles transparent pixles 
     if (bm.GetPixel(i, j).R == 0 & bm.GetPixel(i, j).G == 0 & bm.GetPixel(i, j).B == 0 & bm.GetPixel(i, j).A == 0) bm.SetPixel(i, j, Color.Transparent); 
     // Passes the grey component of the grescale image to R and G compenents and changes pixle color 
     else bm.SetPixel(i, j, Color.FromArgb(bm.GetPixel(i, j).R, bm.GetPixel(i, j).R, 0)); 
    } 
} 

// Save image 
bm.Save("D:\\b.png"); 

내가 일을 할 이러한 두 가지 방법을 썼다 게시 된 이미지

enter image description here

+0

FromArgb에서 Red를 두 번 가져 왔습니다. 아마 당신은 레드와 그린을 가져 가고 싶었을 것입니다. – Ralf

+0

나는 R을 두 번 (오래된 이미지에서 회색) 가져 와서 이들 각각을 새로운 R과 G로 전달했습니다. 두 가지 구성 요소는 노란색으로 구성됩니다. – Sisyphus

+0

다른 대답으로 해결책을 추가했습니다. – yurart

관련 문제