2012-03-26 6 views
6

각 이미지를 만들기 위해 서로 다른 알파 레이어를 사용하여 모두 흑백 인 총 3 개의 크기 (총 84 개)의 28 개 이미지가 있습니다. 나는 그들 각각을 5 가지 색상으로 이용할 수있게 만들고 싶다. 총 420 이미지가됩니다. 이것은 분명히 수동으로하는 데 큰 고통이 될 것입니다. Photoshop 기능이 없기 때문에 Photoshop이 없습니다. 나는 Paint.NET을 가지고 있지만 색조를 변경해도 내가 원하는 색상을 제공하지 않기 때문에 색조를 조정할 수 없습니다.프로그래밍 방식으로 .png를 어떻게 편집합니까?

기본적으로 이미지의 모든 픽셀에 대해해야 할 일은 RGBA 값을 가져와 RGB를 새 RGB 값으로 바꾸고 동일한 A 값을 유지하는 것입니다.

누구든지이 작업을 수행하는 방법을 알고 있습니까? StackOverflow 또는 Google에서 검색 한 행운이 없었습니다 (아마도 잘못된 검색어 사용).

나는 C#이나 VB.NET에서 답을 선호하지만 어떤 언어로도이를 수행하는 방법을 아는 사람이라면 C#이나 VB.NET에 적용 할 수있을 것입니다.

사람이를 찾아 답을 찾고있는 경우 --Edit--

, 여기에 내가 Yorye 나단에서 링크를 기반으로있어거야.

private const int RED = 51; 
private const int GREEN = 181; 
private const int BLUE = 229; 

private const int NEW_RED = 170; 
private const int NEW_GREEN = 102; 
private const int NEW_BLUE = 204; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    { 

    Image OriginalImage = Image.FromFile(openFileDialog1.FileName); 
    Image NewImage = ColorFilter(OriginalImage); 

    pictureBox1.Image = OriginalImage; 
    pictureBox2.Image = NewImage; 
    } 

} 

public static Image ColorFilter(Image originalImage) 
{ 
    Bitmap newImage = new Bitmap(originalImage); 
    BitmapData originalData = (originalImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    BitmapData newData = (newImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

    int originalStride = originalData.Stride; 
    System.IntPtr originalScan0 = originalData.Scan0; 

    int newStride = newData.Stride; 
    System.IntPtr newScan0 = newData.Scan0; 

    unsafe 
    { 
    byte* pOriginal = (byte*)(void*)originalScan0; 
    byte* pNew = (byte*)(void*)newScan0; 

    int nOffset = originalStride - originalImage.Width * 4; 

    byte red, green, blue; 

    for (int y = 0; y < originalImage.Height; ++y) 
    { 
     for (int x = 0; x < originalImage.Width; ++x) 
     { 
     blue = pOriginal[0]; 
     green = pOriginal[1]; 
     red = pOriginal[2]; 

     if (pOriginal[0] == BLUE && pOriginal[1] == GREEN && pOriginal[2] == RED) 
     { 
      pNew[0] = (byte)NEW_BLUE; 
      pNew[1] = (byte)NEW_GREEN; 
      pNew[2] = (byte)NEW_RED; 
     } 

     pOriginal += 4; 
     pNew += 4; 
     } 
     pOriginal += nOffset; 
     pNew += nOffset; 
    } 
    } 
    (originalImage as Bitmap).UnlockBits(originalData); 
    (newImage as Bitmap).UnlockBits(newData); 
    return newImage; 
} 
+1

나는 (선택한 디렉토리의 모든 이미지를 반복하고 출력 경로를 변경하는 등의 몇 가지 조작으로)이 코드를 실행하고 초당 420 이미지를 생성했습니다. 수작업은 풋내기를위한 것입니다. – Nick

답변

4

체크 아웃 question. 픽셀을 교체하는 대신 조금 더 조정하여 교체하는 대신 픽셀을 추가하십시오. 그러면 좋은 결과를 얻으실 수 있습니다.

+0

고마워, 그게 내가 필요한거야. 다른 사람들이 검색에서이 문제를 발견 할 경우를 대비하여 질문을 업데이트하고 해결책을 게시했습니다. – Nick

+0

위대한, 행운을 빌어 요 :) – SimpleVar

관련 문제