Bonjour,
J'ai cru devenir fou avec ce projet très simple de chez efg, qui fait deux choses :
- afficher une grille dessinée sur le canvas d'un bitmap ou charger un fichier .bmp puis
- réduire la taille de l'image affichée.
(les boutons et cases à cocher à droite sont des ajouts perso pour tests, suite lecture, voir tt en bas)
Il m'a fallu blinder le code de ShowMessage pour comprendre :
au run (l'image est créée au FormCreate) -->
image ok (présentée un peu réduite ci-dessus)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 create -- PixelFormat = 24 Bits <--- BitmapOriginal est examiné resize -- PixelFormat = 24 Bits <--- bmp de travail
si bouton load pour choisir un fichier 24 bits -->
image en vrac (couleurs fausses, les traits verticaux, )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 load -- PixelFormat = 24 Bits <--- BitmapOriginal est examiné resize -- PixelFormat = 24 Bits <--- bmp de travail
Au final et après pas mal de tests dans la procédure ScanlineResize, voilà ce que j'ai noté en commentaires dans le FormCreate :
pour que la grille soit correctement affichée, IL FAUT utiliser pRGBQuad pour la source et la destination dans la procédure de resize.
MAIS pour qu'un fichier chargé par le bouton "load" soit bien affiché, IL FAUT y mettre pRGBTriple pour la source et pRGBQuad pour la destination.
Je vous laisse imaginer le plaisir pour maintenir tout ça (et je n'ai pas testé avec les bmp en 32 bits, ni tous les fichiers cassés d'un dossier de test proposé par Jérôme il y a quelque temps déjà).
Cœur de la procédure :
Un peu de lecture utile sur le sujet .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 VAR ... rowInc : pRGBQuad; // ok avec image créée au FormCreate rowInf : pRGBTriple; // ok avec loadimage et le fichier bonbons_640x500x24.bmp rowOut : pRGBQuad; BEGIN ... BitmapSmalller.BeginUpdate(); if letter = 'c' then // FormCreate FOR j := 0 TO BitmapSmalller.Height-1 DO BEGIN rowInc := pRGBQuad(BitmapOriginal.RawImage.GetLineStart(factor*j)); rowOut := pRGBQuad(BitmapSmalller.RawImage.GetLineStart(j)); FOR i := 0 To BitmapSmalller.Width-1 DO BEGIN lookup := factor*i; rowOut[i] := rowInc[lookup] // dessous identique, gardé pour mémoire {WITH rowOut[i] DO BEGIN rgbRed := rowInc[lookup].rgbRed; rgbGreen := rowInc[lookup].rgbGreen; rgbBlue := rowInc[lookup].rgbBlue; rgbReserved := rowInc[lookup].rgbReserved; END } END; END else // bouton Load FOR j := 0 TO BitmapSmalller.Height-1 DO BEGIN rowInf := pRGBTriple(BitmapOriginal.RawImage.GetLineStart(factor*j)); rowOut := pRGBQuad( BitmapSmalller.RawImage.GetLineStart(j)); FOR i := 0 To BitmapSmalller.Width-1 DO BEGIN lookup := factor*i; WITH rowOut[i] DO BEGIN rgbRed := rowInf[lookup].rgbtRed; rgbGreen := rowInf[lookup].rgbtGreen; rgbBlue := rowInf[lookup].rgbtBlue; rgbReserved := 255; END END; END; BitmapSmalller.EndUpdate();
Partager