2013-05-24 9 views
2

J'essaie de copier une image d'un fichier à un autre en utilisant libjpeg. J'ai essayé d'utiliser jpeg_read_scanlines/jpeg_write_scanlines pour copier des données d'image mais pour autant que je sache, ces fonctions calculent DCT/IDCT plus de/quantification. Je n'ai pas besoin d'effectuer ces opérations, en fait je ne le veux pas. Après la copie de données, je veux manipuler les coefficients DCT quantifiés, donc utiliser ImageMagick ou un autre logiciel n'est pas une option. Existe-t-il un moyen plus rapide de le faire, sans étape IDCT/DCT?libjpeg: copie de données entières

Répondre

5

Oui. Vous pouvez utiliser jpeg_read_coefficients() qui lira les coefficients DCT quantifiés pour vous. Vous pouvez ensuite utiliser jpeg_write_coefficients() pour les réécrire dans une autre image. L'usage typique serait quelque chose comme:

struct jpeg_decompress_struct decomp; 
struct jpeg_compress_struct comp; 
jvirt_barray_ptr *coefficients; 
/* Set your error handlers for decomp and comp here */ 
jpeg_create_decompress(&decomp); 
/* Set your decompression source here */ 
jpeg_read_header(&decomp, 1); 
coefficients = read_coefficients(&decomp); 
jpeg_create_compress(&comp); 
jpeg_copy_critical_parameters(&decomp, &comp); 
comp.in_color_space = decomp.out_color_space; /* Not copied by previous call */ 
jpeg_write_coefficients(&comp, coefficients); 
jpeg_finish_compress(&comp); 
/* Destroy comp and decomp */ 

Ce truc est tout décrit dans le fichier libjpeg.txt (en particulier la section vraiment des données brutes) qui est inclus dans la distribution source de libjpeg-turbo. Cette section comprend également des informations sur l'utilisation de fait les coefficients TCD et les manipuler avant de les écrire à nouveau, mais le débit de base qui va:

/* assume that variables are as above */ 
for(int ci = 0; ci < total_components_in_image; ci++) { 
    jpeg_component_info *info = decomp.comp_info + ci; 
    JBLOCKARRAY buffer = (*decomp.mem->access_virt_barray) 
     ((j_common_ptr) &decomp, coefficients[ci], 0, info->height_in_blocks, 0); 
} 

Alors maintenant, le tampon est un tableau en trois dimensions où tampon [y] [x ] [c] est le c e coefficient dans le bloc x et le y bloc vers le bas. access_virt_barray est déclaré quelque chose comme:

access_virt_barray(j_common_ptr cinfo, jvirt_barray_ptr ptr, 
    JDIMENSION starting_row, JDIMENSION rows_to_read, boolean is_write_access); 
+0

Voici un autre exemple de travail de lecture des coefficients TCD: http://daniellerch.me/snippets/stego/dctdump.c La documentation est également disponible en ligne pour un accès facile à l'adresse http://www.opensource.apple.com/source/tcl/tcl-87/tcl_ext/tkimg/tkimg/libjpeg/libjpeg.doc – LostSalad