2010-06-16 6 views
0

32 비트 RGBA 이미지 객체 (원래 32 비트 PNG)를 코드와 필요에 따라 32 비트 그레이 스케일 대응 객체로 변환하고 싶습니다. .32 비트 RGBA 이미지를 그레이 스케일 보존 알파로 변환하는 방법

저는 이미 read 여러 other 개의 질문과 온라인에서 많은 기사를 보았습니다. ColorMatrix를 사용해 보았지만 알파를 잘 처리하지 못하는 것 같습니다. 완전히 불투명 한 그레이 스케일 픽셀입니다. 부분적으로 투명 한 픽셀은 해당 픽셀에 여전히 색조가 있기 때문에 잘 번역되지 않는 것 같습니다. 눈에 띄기에 충분하다.

new System.Drawing.Imaging.ColorMatrix(new float[][]{ 
        new float[] {0.299f, 0.299f, 0.299f, 0, 0}, 
        new float[] {0.587f, 0.587f, 0.587f, 0, 0}, 
        new float[] {0.114f, 0.114f, 0.114f, 0, 0}, 
        new float[] {  0,  0,  0, 1, 0}, 
        new float[] {  0,  0,  0, 0, 1} 
        }); 

이 내가 꽤 표준 NTSC 가중 행렬을 읽은대로입니다 다음과 같이 내가 사용

ColorMatrix입니다. 그런 다음 Graphics.DrawImage과 함께 사용합니다. 그러나 부분적으로 투명한 픽셀은 여전히 ​​채색되어 있습니다. 나는 이것이 WinForms PictureBox을 통해 Image 객체를 흰색 배경에 표시하고 있음을 지적해야합니다. PictureBox가 이미지를 그려 투명 파트를 처리하는 방식 일 수 있습니까? 배경 색상이 영향을 미치지 않습니다. (색상의 색조는 원래 이미지에서 나온 것입니다.)하지만 PictureBox는 투명 픽셀을 올바르게 다시 그리지 않습니다.

OpacityMask와 함께 FormatConvertedBitmap을 사용하는 몇 가지 방법을 보았습니다. 나는 그것을 시도하지 않았다. 왜냐하면 주로 PresentationCore.dll을 가져올 필요가 없다. (.NET 2.0 제한된 응용 프로그램에서는 작동하지 않는다.) 물론 기본적인 System.Drawing. * 작업은이 간단한 절차를 수행 할 수 있습니까? 안 그래요?

+0

이미지의 배경에 색조가 있지 않은 것은 확실합니까? RGB 값이 정확히 같으면 색이 없어야합니다. ColorMatrix 정의 게시. – ChrisF

+0

나는 그렇지 않을 것이라고 확신합니다. 이미지는 PictureBox를 통해 표시됩니다. 물론 PictureBox의 배경은 투명합니다. 실제로 부모의 색 (이 경우 흰색)을 사용한다는 것을 의미합니다. 그러나 새 회색 음영 이미지의 투명한 가장자리는 여전히 녹색으로 물 들었습니다 (원본 이미지의 색상은 대부분 녹색이었습니다). –

답변

5

ColorMatrix를 사용하여 이미지를 그릴 수 있습니까? 그것은 물론 작동하지 않을 것입니다. 왜냐하면 녹색 픽셀 위에 반투명 회색을 칠하면 일부 녹색이 빛날 것입니다. 투명한 픽셀 만 포함 된 비어있는 새 비트 맵에 페인트해야합니다.

+0

아, 아마도 옳은 것 같습니다. 이봐,이 시간에 버그 나 무언가를 찾길 바랬다. 그러나 평소와 같이, 그것은 단지 내가 바보가되는 것입니다. –

0

이미지를 TGA로 변환하면 압축되지 않은 이미지 형식으로 "RubyPixels"을 사용하여 픽셀 데이터를 직접 편집하고 원하는대로 처리 할 수 ​​있습니다. 그런 다음 다시 PNG로 변환 할 수 있습니다.

루비에서 ImageMagick으로 변환하는 것이 좋습니다.

+0

어쩌면 명확하지 않지만 이미지의 원래 형식 (GIF, PNG, JPG 등)에 관심이 없거나 저장하기 위해 변환하지 않았습니다. 나는 .NET의 Image 객체가 원래 PNG에서 만들어 졌다는 것을 명시하고있었습니다. WinForms 환경에서이 Image 객체를 직접 사용하고 있으며,이 경우에는 비활성화 된 모양으로 색상을 조작하고 있습니다. 나는 그것을 다시 구할 의사가 없습니다. 즉각적인 "회색조"를위한 것입니다. 그럼에도 불구하고 다른 사람이 관심을 가질 경우 제안에 대한 링크를 제공 할 수 있습니까? –

+0

죄송합니다, 그 경우에는 당신을 도울 수 없습니다 ... = < – thomasfedb

3

danbystrom의 호기심 덕분에, 저는 실제로 원본 위에 다시 그려졌습니다. 관심있는 사람은 다음과 같이 수정 된 방법을 사용했습니다.

using System.Drawing; 
using System.Drawing.Imaging; 

public Image ConvertToGrayscale(Image image) 
{ 
    Image grayscaleImage = new Bitmap(image.Width, image.Height, image.PixelFormat); 

    // Create the ImageAttributes object and apply the ColorMatrix 
    ImageAttributes attributes = new System.Drawing.Imaging.ImageAttributes(); 
    grayscaleMatrix = new ColorMatrix(new float[][]{ 
     new float[] {0.299f, 0.299f, 0.299f, 0, 0}, 
     new float[] {0.587f, 0.587f, 0.587f, 0, 0}, 
     new float[] {0.114f, 0.114f, 0.114f, 0, 0}, 
     new float[] {  0,  0,  0, 1, 0}, 
     new float[] {  0,  0,  0, 0, 1} 
     }); 
    attributes.SetColorMatrix(grayscaleMatrix); 

    // Use a new Graphics object from the new image. 
    using (Graphics g = Graphics.FromImage(grayscaleImage)) 
    { 
     // Draw the original image using the ImageAttributes created above. 
     g.DrawImage(image, 
        new Rectangle(0, 0, grayscaleImage.Width, grayscaleImage.Height), 
        0, 0, grayscaleImage.Width, grayscaleImage.Height, 
        GraphicsUnit.Pixel, 
        attributes); 
    } 

    return grayscaleImage; 
} 
관련 문제