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.

Nom : scanlineresize.jpg
Affichages : 258
Taille : 59,5 Ko
(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) -->
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
image ok (présentée un peu réduite ci-dessus)

si bouton load pour choisir un fichier 24 bits -->
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
image en vrac (couleurs fausses, les traits verticaux, )


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 :
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();
Un peu de lecture utile sur le sujet .