Comment puis-je prendre un DIB et le convertir en un TIF en utilisant libtiff

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

  •  13-09-2019
  •  | 
  •  

Question

Je suis en train de lire dans une image numérisée et compresser à partir d'un DIB en mémoire dans un fichier TIF. J'utilise la bibliothèque libtiff et ont trouvé un couple des exemples en ligne, mais aucun d'entre eux ne vraiment que je les dois. Je dois prendre l'image de la DIB et la transformer en une image B & W.

Voici le code que j'ai modifié à partir d'un exemple en ligne. Il ne se transforme en noir et blanc, mais il montre aussi qu'une partie de l'analyse plutôt que la chose. Toute aide serait appréciée.

* EDIT: Je l'ai remarqué cela se produit si je scanne en tant qu'image gris, si je scanne en noir et blanc comme alors l'image renvoyée est tout à fait noir, je ne sais pas si cela aide à tous.

// set up the image tags 
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, w);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tif, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);

unsigned char * psrc = (unsigned char *)lpBits;
unsigned char * pdst = new unsigned char[(w)];

UINT32 src_index;
UINT32 dst_index;

// now go line by line to write out the image data
for (unsigned int row = 0; row < h; row++ )
{

    // initialize the scan line to zero
    memset(pdst,0,(size_t)(w));

    // moving the data from the dib to a row structure that
    // can be used by the tiff library
    for (unsigned int col = 0; col < w; col++){
        src_index = (h - row - 1) * total_width * bytecount
                                  + col * bytecount;
        dst_index = col;
        pdst[dst_index++] = psrc[src_index+2];
        pdst[dst_index++] = psrc[src_index+1];
        pdst[dst_index] = psrc[src_index];
        result++;
    }

    // now actually write the row data
    TIFFWriteScanline(tif, pdst, row, 0);
}
Était-ce utile?

La solution

Je peux me tromper, mais je pense que pour CCITTFAX4 codant pour libtiff prévoit huit pixels par octet, rembourré à la fin de l'octet, si la largeur de l'image ne sont pas divisibles par 8.

Si la largeur de l'image est de 150, par exemple, la ligne de balayage devrait être de 19 octets, et non 150.

Il y a un bon exemple d'utilisation libtiff , si elle ne comprend pas les informations de coupe couleur d'envoi à un seuil et l'emballage des pixels 8 par octet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top