이론적으로 : iPhone OS에서 Alpha 구성 요소가 PNG의 다른 구성 요소에 어떻게 배정되며, 어떻게 제대로 배출 할 수 없는가?

StackOverflow https://stackoverflow.com/questions/870690

문제

사실, 나는 그것을 달성하기 쉬운 방법이있을 것이라고 생각했습니다. 내가 필요한 것은 순수한 알파 가치 정보입니다. 테스트를 위해 50 x 55 PX PNG가 있으며, 여기서 모든 가장자리에는 5x5 픽셀 사각형이 완전히 투명합니다. 이 영역에서 알파는 0.Eaverevere가되어야합니다.

이것이 이론적으로 정확한지 알려주세요. 알파 채널 만있는 cgimageref를 만들었습니다. 이것은 cgbitmapcontextcreate 및 kcgimagealphaonly를 PARAM으로 사용합니다. cgbitmapcontextgetBitsperPixel (컨텍스트)은 나에게 1을 반환하므로 픽셀 당 하나의 구성 요소가 하나만 있고 원하는 알파 값이 있음을 나타냅니다. 나는 cgbitmapcontextcreate가 주어진 이미지에서 새로운 생성 된 컨텍스트로 모든 변환을 처리 할 것이라고 읽었습니다. 내 이미지는 이전에 PNG-24 였지만 투명성이 있었지만 Xcode의 PNGCrunch는 어떻게 든 변환하는 것 같습니다.

이론적으로 :이 시점에서 정확하고 비공식적 인 알파에 도달 할 기회가 있습니까? 내가 얻는 값은 거의 일치하는 것처럼 보이지만 큰 5x5 투명 사각형에서는 19, 197, 210, 0, 0, 98 등과 같은 값을 얻습니다. 그들이 사실이라면, 나는 이미지에서 무언가를 봐야 할 것입니다. 이미지 자체는 단단합니다.

도움이 되었습니까?

해결책

Pimultiplication은 알파 채널에 영향을 미치지 않으며 색상 채널에 영향을 미칩니다.

래스터 작곡을위한 공식 (하나의 래스터 이미지를 다른 래스터 이미지에 넣음)은 다음과 같습니다.

dst.r = src.r * src.a + dst.r * (1.0 - src.a);
dst.g = src.g * src.a + dst.g * (1.0 - src.a);
dst.b = src.b * src.a + dst.b * (1.0 - src.a);

Pimultiplication은 첫 번째 곱셈 표현을 잘라냅니다.

dst.r = src.r′ + dst.r * (1.0 - src.a);
dst.g = src.g′ + dst.g * (1.0 - src.a);
dst.b = src.b′ + dst.b * (1.0 - src.a);

소스 색상 구성 요소에 이미 알파 구성 요소가 곱하기 때문에 "Pimultiplied"라는 이름이기 때문에 작동합니다. 이미 결과가 있기 때문에 지금 곱할 필요가 없습니다.

배수가없는 알파

알파 구성 요소 자체는 결코 전례가되지 않습니다. 무엇을 곱 하시겠습니까? 그만큼 색깔 구성 요소는 배정됩니다 알파에 의해.

다른 팁

화려한 색상 값은 간단하기 때문에 다음과 같이 간단하기 때문입니다.

r = (r * a) / 255;
g = (g * a) / 255;
b = (b * a) / 255;

역수를 얻는 것은 다음과 같습니다.

if (a > 0) {
    r = (r * 255) / a;
    g = (g * 255) / a;
    b = (b * 255) / a;
}

이 포름은 정확하지 않습니다. 목표는 후자가 동일한 다중화 된 값으로 결과를 초래할 수없는 비 배양 (r, g, b)을 찾는 것입니다 (원래 r, g, b 값을 찾을 수는 없습니다.

그러나 위의 공식으로 우리는

alpha = 100
r_premulti = 1

재구성 된 r = 2;

후자는이 r이 다시 다중화되면 2 * 100 / 255 = 0을 찾았지만 대신 r_premulti == 1을 원했습니다 !!

올바른 포름이 필요합니다 모으다. R- 성분에 대한 예 :

reconstruced r = ceiling(r_premulti * 255 / alpha)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top