Bonjour,
j'aimerais convertir easyexif::EXIFInfo result, comment dois-je procéder ?
Merci d'avance.
Version imprimable
Bonjour,
j'aimerais convertir easyexif::EXIFInfo result, comment dois-je procéder ?
Merci d'avance.
Bonjour,
Le plus simple sera de choisir une bibliothèque JSON. Ou bien, à la main (mais je déconseille) et d'écrire un fichier JSON à partir des données de la structure que vous avez.
Cela dépend de la finalité de la conversion :mrgreen:
Si c'est pour transmettre des données entre différentes parties d'1 programme (en mémoire donc), 1 bibliothèque est le mieux.
Mais pour l'écriture d'1 fichier ou la mise dans 1 base de données, souvent le "quick and dirty" est le + simple, le + rapide et le + efficace.
:whistle: et pour cela printf est très largement supérieur à cout.
1 exemple, même si les noms des champs ne sont pas terribles pour 1 recherche :
Code:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 printf("{ \"manufacturer name\": \"%s\", \"model\": \"%s\", \"software used\": \"%s\", \"image\": { \"description\": \"%s\", \"width\": %d, \"height\": %d, \"description\": \"%s\", \"orientation\": %d, \"copyright\": \"%s\" }, \"date/time\": { \"image date/time\": \"%s\", \"original date/time\": \"%s\", \"digitize date/time\": \"%s\", \"subsecond time\": \"%s\", \"exposure time\": %d }, \"take\": { \"F-stop\": %.1f, \"exposure program\": %d, \"ISO speed\": %d, \"subject distance\": %f, \"exposure bias\": %f, \"flash used?\": %d, \"flash returned light\": %d, \"flash mode\": %d, \"metering mode\": %d }, \"focal length\": { \"lens\": %f, \"35mm\": %u }, \"GPS\": { \"latitude\": \"%f deg (%f deg, %f min, %f sec %c)\", \"longitude\": \"%f deg (%f deg, %f min, %f sec %c)\", \"altitude\": %f, \"precision\": %f }, \"lens\": { \"min focal length\": %f, \"max focal length\": %f, \"f-stop min\": %.1f, \"f-stop max\": %.1f, \"make\": \"%s\", \"model\": \"%s\" }, \"focal plane\": { \"XRes\": %f, \"YRes\": %f } }", result.Make.c_str(), result.Model.c_str(), result.Software.c_str(), result.ImageDescription.c_str(), result.ImageWidth, result.ImageHeight, result.ImageDescription.c_str(), result.Orientation, result.Copyright.c_str(), result.DateTime.c_str(), result.DateTimeOriginal.c_str(), result.DateTimeDigitized.c_str(), result.SubSecTimeOriginal.c_str(), (unsigned)(1.0 / result.ExposureTime)), result.FNumber, result.ExposureProgram, result.ISOSpeedRatings, result.SubjectDistance, result.ExposureBiasValue, result.Flash, result.FlashReturnedLight, result.FlashMode, esult.MeteringMode, result.FocalLength, result.FocalLengthIn35mm, result.GeoLocation.Latitude, result.GeoLocation.LatComponents.degrees, result.GeoLocation.LatComponents.minutes, result.GeoLocation.LatComponents.seconds, result.GeoLocation.LatComponents.direction, result.GeoLocation.Longitude, result.GeoLocation.LonComponents.degrees, result.GeoLocation.LonComponents.minutes, result.GeoLocation.LonComponents.seconds, result.GeoLocation.LonComponents.direction, result.GeoLocation.Altitude, result.GeoLocation.DOP, result.LensInfo.FocalLengthMin, result.LensInfo.FocalLengthMax, result.LensInfo.FStopMin, result.LensInfo.FStopMax, result.LensInfo.Make.c_str(), result.LensInfo.Model.c_str(), result.LensInfo.FocalPlaneXResolution, result.LensInfo.FocalPlaneYResolution);
Peut-on placer le printf() dans une variable std::string (de préférence) ou cstring ?
Comme je l'ai dit, cela va dépendre de ta conversion 1 print/ cout c'est pour l'écrire dans 1 fichier.
Si tu veux le stocker dans 1 chaîne de caractère tu peux le faire, mais il faut avoir l'utilité. Et ce n'est plus avec 1 print, mais avec 1 sprintf ou 1 std::ostringstream en C++
std::ostringstream, documentation cplusplus.com en anglais
sprintf, documentation cplusplus.com en anglais
en utilisant "asprintf()" je peux le placer dans une variable.
Merci pour l'aide.
Quand je vois la simplicité pour faire du JSON, ce printf me donne envie de vomir :triste:....
Exemple avec : https://github.com/nlohmann/json
Sortie :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <nlohmann/json.hpp> #include <iostream> int main() { nlohmann::json j; j["manufacturer name"] = "some name"; j["model"] = "some model"; j["software used"] = "some software"; const std::string str = j.dump(); std::cout << str << '\n'; }
Pour essayer en ligne : https://godbolt.org/z/jrjc7vWbhCitation:
{"manufacturer name":"some name","model":"some model","software used":"some software"}
@Bktero
Bonne suggestion, merci.
A noter au passage qu'il existe l'excellent bibliothèque https://github.com/fmtlib/fmt pour faire des printf() en mode C++
Typiquement qq chose comme :
deviendrait qq chose comme :Code:
1
2
3
4
5 printf("GPS Latitude : %f deg (%f deg, %f min, %f sec %c)\n", result.GeoLocation.Latitude, result.GeoLocation.LatComponents.degrees, result.GeoLocation.LatComponents.minutes, result.GeoLocation.LatComponents.seconds, result.GeoLocation.LatComponents.direction);
Ca évite des erreurs dans les formateurs (on a tous un jour mis un %d à la place d'un %f...)Code:
1
2
3
4
5 ftm::print("GPS Latitude : {} deg ({} deg, {} min, {} sec {})\n", result.GeoLocation.Latitude, result.GeoLocation.LatComponents.degrees, result.GeoLocation.LatComponents.minutes, result.GeoLocation.LatComponents.seconds, result.GeoLocation.LatComponents.direction);