2011-01-15 4 views
11

어떻게 이런 종류의 색상 교체를 프로그래밍 방식으로 수행합니까?이미지를 다시 칠하는 방법은 무엇입니까? (이미지 참조)

Color.FromArgb(
    oldColorInThisPixel.R + (byte)((1 - oldColorInThisPixel.R/255.0) * colorToReplaceWith.R), 
    oldColorInThisPixel.G + (byte)((1 - oldColorInThisPixel.G/255.0) * colorToReplaceWith.G), 
    oldColorInThisPixel.B + (byte)((1 - oldColorInThisPixel.B/255.0) * colorToReplaceWith.B) 
    ) 

이 CodeInChaos 감사 : replacing black with blue


그래서 이것은 내가 픽셀을 대체하기 위해 사용했던 기능입니다!

+1

imageView.setColorFilter(getColorFilter(imageView.getContext())); 
? 롤 ... – Vercas

+1

아니 downvotes. 나는 누군가가 당신이 질문을 편집 할 때 upvote를 제거 할 수 있었다고 생각한다. 어느 쪽이든 누군가가 특정 제안이나 비판에 대해 의견을 남기지 않는 한 걱정할 필요가 없습니다. :-) –

답변

8

계산식 새 픽셀 :

newColor.R=OldColor; 
newColor.G=OldColor; 
newColor.B=255; 

임의의 색상으로 일반화 rs :

흰색과 흰색을 해당 색으로 매핑하려고한다고 가정합니다. 따라서 수식 newColor=TargetColor+(White-TargetColor)*Input

newColor.R=OldColor+(1-oldColor/255.0)*TargetColor.R; 
newColor.G=OldColor+(1-oldColor/255.0)*TargetColor.G; 
newColor.B=OldColor+(1-oldColor/255.0)*TargetColor.B; 

된 후 단지 이미지 (바이트 배열)의 화소를 반복하여 새로운 RGB 어레이에 기록. 이미지를 바이트 배열로 복사하고 조작하는 방법에 대한 많은 스레드가 있습니다.

+0

이 답변은 나에게 가장 잘 보이지만 파란색은 어떤 색이라도 될 수 있습니다. – Vercas

+0

@Vercas 임의 색상의 공식을 추가했습니다. – CodesInChaos

+1

@CodeInChaos 지금 수식을 테스트하고 있습니다. 또한, .R, .G 및 .B를 "oldColor"변수에 추가하는 것을 잊었습니다. – Vercas

2

이 코드 프로젝트 문서는이과를 다루고 더 :

// create filter 

    AForge.Imaging.Filters.HSLFiltering filter = 
     new AForge.Imaging.Filters.HSLFiltering(); 
    filter.Hue = new IntRange(340, 20); 
    filter.UpdateHue = false; 
    filter.UpdateLuminance = false; 
    // apply the filter 

    System.Drawing.Bitmap newImage = filter.Apply(image); 
+0

그러면 범위 내의 모든 색상이 내 색상으로 변경됩니까? – Vercas

+0

네, 색조 범위가 이상하게 보입니다 .... 색조는 일반적으로 하나의 단일 값이어야합니다. 그렇지 않습니다. – Nyerguds

+0

저는이 라이브러리가 색상 범위를 사용하여 카메라를 사용하여 캡처 한 이미지에서 쉬운 색상 대체를 허용한다고 생각합니다. 녹색 화면을 생각하면, 녹색은 이미지에서 균일하지 않지만 그림자 등에 따라 범위 내에 있습니다. –

3

어떤 이미지에 많이 의존한다 : http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx

그것은 유사한 효과를 이미지에 색조 필터를 수행 할 AForge.NET 라이브러리를 사용 형식은 무엇이며 최종 형식은 어떻게 될 것입니까?

또한 어떤 도구를 사용 하느냐에 따라 다릅니다. 당신은 사용할 수 있습니다 : 같은 OpenCV의

GDI와 같은

  • GDI
  • GD +
  • 이미지 처리 라이브러리는 매우 빠른 있지만 매우 번거로울 수 있습니다. 팔레트를 변경해야합니다. GDI +는 .NET에서 제공되며 느려지지만 더 쉬울 수 있습니다. OpenCV는 훌륭하지만 종속성을 추가합니다.


    (UPDATE)

    이 코드는 그레이 스케일 대신 블루 스케일 이미지를 변경 - 이미지 포맷은 32 비트 ARGB이다

    private static unsafe void ChangeColors(string imageFileName) 
    { 
        const int noOfChannels = 4; 
        Bitmap img = (Bitmap) Image.FromFile(imageFileName); 
        BitmapData data = img.LockBits(new Rectangle(0,0,img.Width, img.Height), ImageLockMode.ReadWrite, img.PixelFormat); 
        byte* ptr = (byte*) data.Scan0; 
        for (int j = 0; j < data.Height; j++) 
        { 
         byte* scanPtr = ptr + (j * data.Stride); 
         for (int i = 0; i < data.Stride; i++, scanPtr++) 
         { 
          if (i % noOfChannels == 3) 
          { 
           *scanPtr = 255; 
           continue; 
          } 
          if (i % noOfChannels != 0) 
          { 
           *scanPtr = 0; 
          } 
         } 
        } 
    
        img.UnlockBits(data); 
        img.Save(Path.Combine(Path.GetDirectoryName(imageFileName), "result.png"), ImageFormat.Png); 
    } 
    
+0

'System.Drawing.Image'는 제 이미지 형식입니다. :) – Vercas

+0

예 내 친구이지만 ImageFormat이 중요합니다. 8 비트 그레이 스케일인가요? 24 비트 Windows 비트 맵? 알파가있는 32 비트? 어떤 것을 사용하고 싶은지 말해 주면 코드 예제를 줄 수 있습니다. – Aliostad

+0

음, 투명도가없는 PNG 이미지를 열어서 24 비트라고 생각합니다. – Vercas

1

또한 원하는대로 달라집니다. 원본을 유지하고 표시 방식 만 조정하고 싶습니까? WPF의 효과 또는 pixelshader가 트릭을 수행하고 매우 빨라질 수 있습니다.

+0

아니요, 원본을 조정해야합니다. – Vercas

9

이미지를 처리하는 데 가장 쉬운 방법은 ColorMatrix이며, 원하는 효과를 미리보기로 처리 할 수도 있습니다. 이것은 그래픽 편집 응용 프로그램에서 얼마나 많은 색상 필터가 만들어 지는지입니다. Herehere C#의 Colormatrix를 사용하여 색상 효과 소개를 찾을 수 있습니다.ColorMatrix를 사용하면 세피아, 검정/흰색, 반전, 범위, 광도, 대비, 밝기, 레벨 (다중 패스 기준) 등 원하는 색상 필터를 만들 수 있습니다.

EDIT : 다음 예는 업데이트 - 고정 된 컬러 매트릭스 푸른 부분 이외의 영점 이전 대신에 청색으로 어두운 값을 시프트 - 및 - 부가 0.5F 블루로 인해 블랙 상기 포토 파란색 50 %)로 전환된다 :

var cm = new ColorMatrix(new float[][] 
{ 
    new float[] {1, 0, 0, 0, 0}, 
    new float[] {0, 1, 1, 0, 0}, 
    new float[] {0, 0, 1, 0, 0}, 
    new float[] {0, 0, 0, 1, 0}, 
    new float[] {0, 0, 0.5f, 0, 1} 
}); 

var img = Image.FromFile("C:\\img.png"); 
var ia = new ImageAttributes(); 
ia.SetColorMatrix(cm); 

var bmp = new Bitmap(img.Width, img.Height); 
var gfx = Graphics.FromImage(bmp); 
var rect = new Rectangle(0, 0, img.Width, img.Height); 

gfx.DrawImage(img, rect, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia); 

bmp.Save("C:\\processed.png", ImageFormat.Png); 
+0

컬러 매트릭스를 사용할 수도 있지만 그게 무엇인지 또는 내 용도로 사용하는 방법을 모릅니다. – Vercas

+0

위 예제는 정확히 위의 예제 이미지 변환을 수행합니다. – too

+0

마지막 행에서 값을 실험 해 볼 수 있습니다. 3 값은 RGB 값을 추가합니다 (-1에서 1까지의 값은 -255에서 255까지의 값을 의미 함). 대각선은 원본 RGB 값의 곱셈입니다 (너무 많이 곱하거나 더하면 픽셀 값은 0 또는 255), 대각선 근처에 파란색으로 값을 이동하려면 1을 설정했습니다. 실험, 그만한 가치가 있습니다. – too

4

넌 정액 여기서 ColorMatrix를 사용하고 싶습니다. 원본 이미지는 회색조이며 R, G 및 B 값은 모두 동일합니다. 그런 다음 검정을 RGB = (0, 0, 255)로 바꾸고 어두운 파란색을, 흰색을 RGB = (255, 255, 255)로하여 흰색을 얻는 것입니다. 매트릭스 따라서 다음과 같이 할 수 있습니다

1 0 0 0 0  // not changing red 
0 1 0 0 0  // not changing green 
0 0 0 0 0  // B = 0 
0 0 0 1 0  // not changing alpha 
0 0 1 0 1  // B = 255 

이 샘플 양식이 오른쪽 이미지 재생하기 :

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    private Image mImage; 
    protected override void OnPaint(PaintEventArgs e) { 
     if (mImage != null) e.Graphics.DrawImage(mImage, Point.Empty); 
     base.OnPaint(e); 
    } 
    private void button1_Click(object sender, EventArgs e) { 
     using (var srce = Image.FromFile(@"c:\temp\grayscale.png")) { 
      if (mImage != null) mImage.Dispose(); 
      mImage = new Bitmap(srce.Width, srce.Height); 
      float[][] coeff = { 
          new float[] { 1, 0, 0, 0, 0 }, 
          new float[] { 0, 1, 0, 0, 0 }, 
          new float[] { 0, 0, 0, 0, 0 }, 
          new float[] { 0, 0, 0, 1, 0 }, 
          new float[] { 0, 0, 1, 0, 1 }}; 
      ColorMatrix cm = new ColorMatrix(coeff); 
      var ia = new ImageAttributes(); 
      ia.SetColorMatrix(new ColorMatrix(coeff)); 
      using (var gr = Graphics.FromImage(mImage)) { 
       gr.DrawImage(srce, new Rectangle(0, 0, mImage.Width, mImage.Height), 
        0, 0, mImage.Width, mImage.Height, GraphicsUnit.Pixel, ia); 
      } 
     } 
     this.Invalidate(); 
    } 
} 
+0

파란색은 그저 하나의 예일뿐입니다. 다시 칠하기 이미지에는 그레이 스케일뿐만 아니라 모든 색상이있을 수 있으며 대체/추가 할 색상은 R, G 및 B가 될 수있는 어떤 색상이 될 수 있습니다. 나는이 색 매트릭스를 전혀 이해하지 못합니다. – Vercas

+1

글쎄, 이것은 색상을 대체하기 위해 ColorMatrix를 사용하는 방법의 예일뿐입니다. 당신은 자신의 교체를하기 위해 자신의 계수를 생각해 내야 할 것입니다. 이 자습서를 사용하여 작동 방식에 대한 통찰력을 얻으십시오. http://active.tutsplus.com/tutorials/effects/manipulate-visual-effects-with-the-colormatrixfilter-and-convolutionfilter/ –

0

모든 안드로이드 DEVS이보고 끝날 경우를,이 나는 회색으로 해낸 것입니다 CodedInChaos의 수식과 안드로이드 그래픽 클래스 ColorMatrixColorMatrixColorFilter을 사용하여 이미지를 스케일 및 색조를 지정하십시오.

도움 주셔서 감사합니다.

public static ColorFilter getColorFilter(Context context) { 
    final int tint = ContextCompat.getColor(context, R.color.tint); 

    final float R = Color.red(tint); 
    final float G = Color.green(tint); 
    final float B = Color.blue(tint); 

    final float Rs = R/255; 
    final float Gs = G/255; 
    final float Bs = B/255; 

    // resultColor = oldColor + (1 - oldColor/255) * tintColor 
    final float[] colorTransform = { 
      1, -Rs, 0, 0, R, 
      1, -Gs, 0, 0, G, 
      1, -Bs, 0, 0, B, 
      0, 0, 0, 0.9f, 0}; 

    final ColorMatrix grayMatrix = new ColorMatrix(); 
    grayMatrix.setSaturation(0f); 
    grayMatrix.postConcat(new ColorMatrix(colorTransform)); 
    return new ColorMatrixColorFilter(grayMatrix); 
} 

ColorFilter는 이미지 뷰에 적용 할 수

왜 내가 upvote에를 잃고, 또는 downvote셨어요
관련 문제