2010-08-23 5 views
1

Le code ci-dessous (à partir de ce fil: How to use Delphi 2010's new WIC capability on Canon files?) ouvre une image WIC dans une BitMap. Toutefois, si la plage dynamique des valeurs de pixels WIC est grande, ce code perd beaucoup d'informations, car il doit adapter la plage dynamique étendue dans la plage inférieure qu'un pixel Bitmap peut accepter.Comment lire les pixels dans l'image 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; 

Quelqu'un peut-il me montrer un exemple de code qui me permettrait de lire les valeurs de pixel directement à partir du TWICImage, donc je peux accéder aux données d'image sans perte d'information? J'ai besoin des valeurs d'intensité (échelle de gris) de chaque pixel qui peuvent peut-être être calculées à partir des valeurs RVB si elles ne sont pas directement disponibles?

Quelque chose comme:

var 
    PixelValue: Integer; // Grayscale 

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

Répondre

0

Vous devriez pouvoir assign() le TWICImage à un TBitmap, puis accéder aux pixels du bitmap ou propriété ScanLine pour obtenir les données de pixels. Tout comme vous le feriez lors du chargement d'un fichier JPEG.

Par exemple (non testé pseudocode)

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

Comme je l'ai noté (peut-être à tort) dans mon message d'origine, les pixels dans un TBitmap ont une plage de 0..255 (tel qu'il est retourné, par exemple, par ScanLine dans un PByteArray.) Une image WIC, cependant, peut avoir des pixels dont la valeur est dans les dizaines de milliers ou plus ... Le code de la bibliothèque qui est invoqué par (dans mon message original) Image1.Picture.Graphic.Assign (WIC) met à l'échelle la plage étendue (disons 0..10000) à (0..255), perdant ainsi beaucoup de détails. – RobertFrank

+0

Une image bitmap peut avoir différentes profondeurs de couleurs, allant du monochrome (1 bit) au format 24/32 bits (4 octets, 2 milliards de colleurs) ou même plus. La valeur de couleur, alors, pour les bitmaps 24 ou 32 bits est un entier de 32 bits - beaucoup plus que 0-255. Ce que je pense que vous ne comprenez pas, c'est que pour les bitmaps 32 bits, c'est les composants de couleur individuels qui vont de 0 à 255, pas le pixel. Pour obtenir la valeur d'échelle de gris, vous devez ensuite envoyer ces composants de couleur via la fonction de votre choix pour générer une valeur de niveaux de gris de 0-255. – GrandmasterB

+0

Les fichiers raw du canon peuvent être des images High Dynamic Range (exposition, etc.), qui peuvent inclure le spectre à virgule flottante. Il n'y a pas de mappage 1: 1 de ces fichiers sur l'un des formats supportés par Delphi (ni à l'affichage). Dans ce cas, le mot clé à rechercher est _tone mapping_. –

Questions connexes