2010-08-23 5 views
1

아래 코드 (이 스레드에서 : How to use Delphi 2010's new WIC capability on Canon files?)는 WIC 이미지를 BitMap으로 엽니 다.WIC 이미지에서 픽셀을 읽는 방법

그러나 WIC 픽셀 값의 동적 범위가 큰 경우이 코드는 넓은 동적 범위를 비트 맵 픽셀이 수용 할 수있는 낮은 범위로 확장해야하기 때문에 많은 정보를 잃게됩니다.

procedure TForm116.Button1Click(Sender: TObject); 
var 
    WIC: TWICImage; 
begin 
    WIC := TWICImage.Create; 
    try 
    WIC.LoadFromFile('MyFilename.raw'); 
    Image1.Picture.Graphic.Assign(WIC); 
    finally 
    WIC.Free; 
    end; 
end; 

사람이 나에게 나를 TWICImage에서 직접 픽셀 값을 읽게 것이다 샘플 코드를 표시 할 수 있습니다, 그래서 정보의 손실없이 이미지 데이터를 액세스 할 수 있습니까? 직접 사용할 수없는 경우 RGB 값에서 계산할 수있는 각 픽셀의 강도 (그레이 스케일) 값이 필요합니까? 같은

뭔가 : 당신은 assign()에은 TBitmap에 TWICImage 수있게 한 다음 비트 맵의 ​​픽셀 또는 주사선 속성에 액세스해야

var 
    PixelValue: Integer; // Grayscale 

for Row := 0 to WIC.Width do 
    for Col := 0 to WIC.Height 
    PixelValue := WIC.GetPixelValue(Row, Col); 

답변

0

는 픽셀 데이터를 얻을 수 있습니다. JPEG를로드 할 때와 매우 비슷합니다. 예를 들어

(안된 의사)

w := TWICImage.Create(); 
w.LoadFromFile(...) 
b := TBitmap.Create; 
b.assign(w); 
ptr := b.ScanLine[...] 
+0

은 내 원래 게시물 (어쩌면 잘못) 바와 같이,은 TBitmap의 픽셀은 예를 들어,는 ScanLine 의해 반환 (0..255의 범위를 가지고 하지만 PByteArray에서.) WIC 이미지는 값이 수만 또는 그 이상의 픽셀을 가질 수 있습니다 ... (내 원래 게시물에서) 호출되는 라이브러리 코드 Image1.Picture.Graphic.Assign (WIC)는 넓은 범위 (0..10000)에서 (0..255)로 조정하므로 많은 세부 사항을 잃게됩니다. – RobertFrank

+0

비트 맵은 단색 (1 비트)에서 더 일반적으로 24/32 비트 (4 바이트, 20 억 콜레스터) 또는 훨씬 더 많은 다양한 색 농도를 가질 수 있습니다. 24 또는 32 비트 비트 맵의 ​​색상 값은 32 비트 정수이며 0-255보다 훨씬 큽니다. 제 생각에 당신이 오해하고있는 것은 32 비트 비트 맵의 ​​경우 픽셀이 아닌 0-255의 개별 색상 구성 요소입니다. 그레이 스케일 값을 얻으려면 0-255 그레이 스케일 값을 생성하기 위해 원하는 기능을 통해 해당 색상 구성 요소를 보냅니다. – GrandmasterB

+0

캐논 원시 파일은 높은 동적 범위 이미지 (노출 등) 일 수 있으며 전체 부동 소수점 스펙트럼을 포함 할 수 있습니다. Delphi가 지원하는 형식 (또는 디스플레이)에 이러한 파일의 1 : 1 매핑이 없습니다. 이 경우 찾을 키워드는 _tone mapping_입니다. –

관련 문제