2012-04-19 8 views
1

색상 (PNG 색상 유형 3)에 대한 팔레트에 색인을 사용하는 일련의 PNG 이미지가 있습니다. 어떤 경우에는 팔레트의 일부 항목이 수정되는 이미지 사본을 만들어야합니다. 이 방법으로 우리는 원본 PNG를 계속해서 다시 칠합니다.iOS에서 런타임시 색인 된 PNG의 팔레트를 수정하려면 어떻게해야합니까?

자바에서는 IndexedColorModel에서 RGB 값을 가져 와서 값을 수정하고 IndexedColorModel을 새로 만들고 원본 이미지의 래스터 데이터와 새 색상 모델을 사용하여 BufferedImage을 새로 만듭니다.

Actionscript에서 맨손으로 ByteArray으로 PNG 바이트를 읽고 팔레트 청크를 찾고 값을 수정 한 다음 ByteArray의 이미지를 런타임에로드해야합니다.

MonoTouch (이전 버전)를 통해 iOS 용 시스템을 구현하려고 합니다만 벽에 부딪 혔습니다. 나는 Actionscript 접근법이 여기에서도 효과가있을 것이라고 믿지만, 이번에는 그렇게 낮은 수준에서 일하는 것을 피하는 것이 좋을 것이고, 나는 가까이 갈 수있는 것처럼 보인다.

UIImage에서 시작한다면 UIImage.CGImage.ColorSpace으로 색 공간을 확보 할 수 있습니다. colorSpace.Model 인 색인 된 색상 모델인지 확인할 수 있습니다. 필자가 잘 모르는 부분은 팔레트 바이트의 실제 배열을 얻는 방법입니다.

그런 다음 다른 쪽에서는 새 팔레트로 새 이미지를 어떻게 만듭니 까? CGImage.WithColorSpace 그것이 내가 원하는 것을 할 것 같은데 ... 어쩌면? 그리고 나서 새로운 팔레트로 색상 공간을 만들 수 있어야합니다. 표면적으로는 CGColorSpace.CreateIndexed이 내가 원하는 것처럼 보이지만, baseSpace 매개 변수가 어떻게 사용되는지 명확하지 않습니다. 필자가 제공 한 완전히 새로운 색상 표를 사용하여 CGColorSpace을 만든 다음 원본 이미지의 색인을 새 색상 표와 함께 사용하고 싶습니다. 어쩌면 나는 정확히 CGColorSpace이 사용 된 것을 오해하고 있습니다.

답변

1

Actionscript에서 벌거 ByteArray로 PNG 바이트를 읽고 팔레트 청크를 찾고 값을 수정 한 다음 런타임에서 ByteArray의 이미지를로드해야합니다.

이것은 약간 짐승이지만 작동 할 것입니다. 그러나 나는 CoreGraphics가 이것을 피하기 위해 필요한 모든 것을 가지고 있다고 확신합니다. 어쨌든 당신이 CGImage 시작할 수있는 CoreGraphics (CG)을 사용하는 것이기 때문에

는 내가있는 UIImage

에서 시작하고합니다. 샘플 코드 (objc)는 다음과 같습니다. iPhone SDK: accessing indexed color PNG images

팔레트 바이트의 실제 배열을 얻는 방법에 대해 잘 모르겠습니다.

CGColorSpaceGetColorTable은 완벽한 후보로 보입니다. 그러나 그것은 MonoTouch 바인딩에서 누락 된 것 같습니다 (나는 그것을 확인합니다)하지만 수동으로 바인드하고 응용 프로그램에서 사용하는 것이 쉽습니다 (p/invoke).

하지만 나는 baseSpace 매개 변수가 baseSpace에 대한 null 매개 변수를 받아 들일 수

CGColorSpace.CreateIndexed

을 사용하는 방법에 대한 불분명 해요하지만 당신은 원래의 PNG 이미지에서 같은,베이스, GCColorSpace 복사 더 좋을 수 있습니다.

+0

p.s. 누락 된'CGColorSpaceGetColorTable'을 http://bugzilla.xamarin.com foir에서 버그 보고서를 작성하고 색인 된 PNG를 첨부 할 수 있다면 다음 (안정적인) MonoTouch 릴리스에 추가하겠습니다. p/invoke 선언은 github의 (공개) maccore 저장소에서 끝날 것입니다 (그래서 거기에서 복사/붙여 넣기를 할 수 있습니다). 감사! – poupou

+0

아하, 놓친 방법. 오늘 버그 보고서를 제출하겠습니다. 또한 필자는 관련성이 있는지 확신 할 수 없었기 때문에 언급하지 않았지만 실제로는 추가 * 레이어로 작업하고 있습니다. 실제로 소스는 Java로 IKVM을 통해 DLL로 변환됩니다. 수동 바인딩을 수행하는 방법을 (아직) 알지 못하지만 IKVM을 통해 액세스 할 수 있다면 지금은 그 방향으로 조사하러 갈 것입니다. 감사! – roguenet

+0

첨부 된 예제 이미지로 버그가 제출되었습니다. https://bugzilla.xamarin.com/show_bug.cgi?id=4573. 다행스럽게도 필자는 오늘 수동 바인딩을 파헤 칠 시간을 갖고 성공을 다시보고 할 것입니다. – roguenet