summaryrefslogtreecommitdiff
path: root/html/download/im_copy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'html/download/im_copy.cpp')
-rw-r--r--html/download/im_copy.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/html/download/im_copy.cpp b/html/download/im_copy.cpp
new file mode 100644
index 0000000..cf0e0d5
--- /dev/null
+++ b/html/download/im_copy.cpp
@@ -0,0 +1,120 @@
+/* IM 3 sample that copies an image from one file to another.
+ It is good to test the file formats read and write.
+ If the destiny does not supports the input image it aborts and returns an error.
+
+ Needs "im.lib".
+
+ Usage: im_copy <input_file_name> <output_file_name> [<output_format>]
+
+ Example: im_copy test.tif test_proc.tif
+*/
+
+#include <im.h>
+#include <im_util.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+void PrintError(int error)
+{
+ switch (error)
+ {
+ case IM_ERR_OPEN:
+ printf("Error Opening File.\n");
+ break;
+ case IM_ERR_MEM:
+ printf("Insuficient memory.\n");
+ break;
+ case IM_ERR_ACCESS:
+ printf("Error Accessing File.\n");
+ break;
+ case IM_ERR_DATA:
+ printf("Image type not Suported.\n");
+ break;
+ case IM_ERR_FORMAT:
+ printf("Invalid Format.\n");
+ break;
+ case IM_ERR_COMPRESS:
+ printf("Invalid or unsupported compression.\n");
+ break;
+ default:
+ printf("Unknown Error.\n");
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ if (argc < 3)
+ {
+ printf("Invalid number of arguments.\n");
+ return 0;
+ }
+
+ void* data = NULL;
+ imFile* ifile = NULL;
+ imFile* ofile = NULL;
+
+ int error;
+ ifile = imFileOpen(argv[1], &error);
+ if (!ifile)
+ goto man_error;
+
+ char format[10];
+ char compression[20];
+ int image_count;
+ imFileGetInfo(ifile, format, compression, &image_count);
+
+ ofile = imFileNew(argv[2], argv[3]? argv[3]: format, &error);
+ if (!ofile)
+ goto man_error;
+
+ if (!argv[3])
+ imFileSetInfo(ofile, compression);
+
+ for (int i = 0; i < image_count; i++)
+ {
+ int width, height, color_mode, data_type;
+ error = imFileReadImageInfo(ifile, i, &width, &height, &color_mode, &data_type);
+ if (error != IM_ERR_NONE)
+ goto man_error;
+
+ data = malloc(imImageDataSize(width, height, color_mode, data_type));
+
+ error = imFileReadImageData(ifile, data, 0, -1);
+ if (error != IM_ERR_NONE)
+ goto man_error;
+
+ char* attrib_list[50];
+ int attrib_list_count;
+ imFileGetAttributeList(ifile, attrib_list, &attrib_list_count);
+
+ for (int a = 0; a < attrib_list_count; a++)
+ {
+ int attrib_data_type, attrib_count;
+ const void* attrib_data = imFileGetAttribute(ifile, attrib_list[a], &attrib_data_type, &attrib_count);
+ imFileSetAttribute(ofile, attrib_list[a], attrib_data_type, attrib_count, attrib_data);
+ }
+
+ error = imFileWriteImageInfo(ofile, width, height, color_mode, data_type);
+ if (error != IM_ERR_NONE)
+ goto man_error;
+
+ error = imFileWriteImageData(ofile, data);
+ if (error != IM_ERR_NONE)
+ goto man_error;
+ }
+
+ free(data);
+ imFileClose(ifile);
+ imFileClose(ofile);
+
+ return 1;
+
+man_error:
+ PrintError(error);
+ if (data) free(data);
+ if (ifile) imFileClose(ifile);
+ if (ofile) imFileClose(ofile);
+ return 0;
+}