summaryrefslogtreecommitdiff
path: root/codec/convert.c
diff options
context:
space:
mode:
Diffstat (limited to 'codec/convert.c')
-rw-r--r--codec/convert.c899
1 files changed, 899 insertions, 0 deletions
diff --git a/codec/convert.c b/codec/convert.c
new file mode 100644
index 00000000..130e0e73
--- /dev/null
+++ b/codec/convert.c
@@ -0,0 +1,899 @@
+/*
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <openjpeg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <unistd.h>
+#include <string.h>
+
+/* -->> -->> -->> -->>
+
+ BMP IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+/* UINT2 defines a two byte word */
+typedef unsigned short int UINT2;
+
+/* UINT4 defines a four byte word */
+typedef unsigned long int UINT4;
+
+typedef struct {
+ UINT2 bfType; /* 'BM' for Bitmap (19776) */
+ UINT4 bfSize; /* Size of the file */
+ UINT2 bfReserved1; /* Reserved : 0 */
+ UINT2 bfReserved2; /* Reserved : 0 */
+ UINT4 bfOffBits; /* Offset */
+} BITMAPFILEHEADER_t;
+
+typedef struct {
+ UINT4 biSize; /* Size of the structure in bytes */
+ UINT4 biWidth; /* Width of the image in pixels */
+ UINT4 biHeight; /* Heigth of the image in pixels */
+ UINT2 biPlanes; /* 1 */
+ UINT2 biBitCount; /* Number of color bits by pixels */
+ UINT4 biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */
+ UINT4 biSizeImage; /* Size of the image in bytes */
+ UINT4 biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */
+ UINT4 biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */
+ UINT4 biClrUsed; /* Number of color used in the image (0: ALL) */
+ UINT4 biClrImportant; /* Number of important color (0: ALL) */
+} BITMAPINFOHEADER_t;
+
+int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx,
+ int subsampling_dy, int Dim[2])
+{
+
+ FILE *IN;
+ FILE *Compo0 = NULL, *Compo1 = NULL, *Compo2 = NULL;
+ BITMAPFILEHEADER_t File_h;
+ BITMAPINFOHEADER_t Info_h;
+ unsigned char *RGB;
+ unsigned char *table_R, *table_G, *table_B;
+ int i, w, h;
+ int gray_scale = 1, not_end_file = 1, line = 0, col = 0;
+ unsigned char v, v2;
+ UINT4 W, H;
+
+ IN = fopen(filename, "rb");
+ if (!IN) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
+ filename);
+ return 0;
+ }
+
+ File_h.bfType = getc(IN);
+ File_h.bfType = (getc(IN) << 8) + File_h.bfType;
+
+ if (File_h.bfType != 19778) {
+ printf("Error, not a BMP file!\n");
+ return 0;
+ } else {
+ /* FILE HEADER */
+ /* ------------- */
+ File_h.bfSize = getc(IN);
+ File_h.bfSize = (getc(IN) << 8) + File_h.bfSize;
+ File_h.bfSize = (getc(IN) << 16) + File_h.bfSize;
+ File_h.bfSize = (getc(IN) << 24) + File_h.bfSize;
+
+ File_h.bfReserved1 = getc(IN);
+ File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1;
+
+ File_h.bfReserved2 = getc(IN);
+ File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2;
+
+ File_h.bfOffBits = getc(IN);
+ File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits;
+ File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits;
+ File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits;
+
+ /* INFO HEADER */
+ /* ------------- */
+
+ Info_h.biSize = getc(IN);
+ Info_h.biSize = (getc(IN) << 8) + Info_h.biSize;
+ Info_h.biSize = (getc(IN) << 16) + Info_h.biSize;
+ Info_h.biSize = (getc(IN) << 24) + Info_h.biSize;
+
+ Info_h.biWidth = getc(IN);
+ Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth;
+ Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth;
+ Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth;
+ w = Info_h.biWidth;
+
+ Info_h.biHeight = getc(IN);
+ Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight;
+ Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight;
+ Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight;
+ h = Info_h.biHeight;
+
+ Info_h.biPlanes = getc(IN);
+ Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes;
+
+ Info_h.biBitCount = getc(IN);
+ Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount;
+
+ Info_h.biCompression = getc(IN);
+ Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression;
+ Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression;
+ Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression;
+
+ Info_h.biSizeImage = getc(IN);
+ Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage;
+ Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage;
+ Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage;
+
+ Info_h.biXpelsPerMeter = getc(IN);
+ Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter;
+ Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter;
+ Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter;
+
+ Info_h.biYpelsPerMeter = getc(IN);
+ Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter;
+ Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter;
+ Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter;
+
+ Info_h.biClrUsed = getc(IN);
+ Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed;
+ Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed;
+ Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed;
+
+ Info_h.biClrImportant = getc(IN);
+ Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant;
+ Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant;
+ Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant;
+
+ /* Read the data and store them in the OUT file */
+
+ if (Info_h.biBitCount == 24) {
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+ img->numcomps = 3;
+ img->comps =
+ (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ for (i = 0; i < img->numcomps; i++) {
+ img->comps[i].prec = 8;
+ img->comps[i].bpp = 8;
+ img->comps[i].sgnd = 0;
+ img->comps[i].dx = subsampling_dx;
+ img->comps[i].dy = subsampling_dy;
+ }
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ Compo1 = fopen("Compo1", "wb");
+ if (!Compo1) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
+ }
+ Compo2 = fopen("Compo2", "wb");
+ if (!Compo2) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
+ }
+
+ /* Place the cursor at the beginning of the image information */
+ fseek(IN, 0, SEEK_SET);
+ fseek(IN, File_h.bfOffBits, SEEK_SET);
+
+ W = Info_h.biWidth;
+ H = Info_h.biHeight;
+ if (Info_h.biWidth % 2)
+ W++;
+
+ RGB = (unsigned char *) malloc(3 * W * H * sizeof(unsigned char));
+
+ fread(RGB, sizeof(unsigned char), 3 * W * H, IN);
+ for (i = 0; i < W * H; i++) {
+ unsigned char R, G, B;
+
+ B =
+ RGB[3 * W * H - ((i * 3) / (3 * W) + 1) * 3 * W +
+ (i * 3) % (W * 3)];
+ G =
+ RGB[3 * W * H - ((i * 3 + 1) / (3 * W) + 1) * 3 * W +
+ (i * 3 + 1) % (W * 3)];
+ R =
+ RGB[3 * W * H - ((i * 3 + 2) / (3 * W) + 1) * 3 * W +
+ (i * 3 + 2) % (W * 3)];
+ if ((i % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) {
+ fprintf(Compo0, "%c", R);
+ fprintf(Compo1, "%c", G);
+ fprintf(Compo2, "%c", B);
+ }
+ }
+ fclose(Compo0);
+ fclose(Compo1);
+ fclose(Compo2);
+ free(RGB);
+ } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) {
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+
+ table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
+ table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
+ table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
+
+ for (i = 0; i < Info_h.biClrUsed; i++) {
+ table_B[i] = getc(IN);
+ table_G[i] = getc(IN);
+ table_R[i] = getc(IN);
+ getc(IN);
+ if (table_R[i] != table_G[i] && table_R[i] != table_B[i]
+ && table_G[i] != table_B[i])
+ gray_scale = 0;
+ }
+
+ /* Place the cursor at the beginning of the image information */
+ fseek(IN, 0, SEEK_SET);
+ fseek(IN, File_h.bfOffBits, SEEK_SET);
+
+ W = Info_h.biWidth;
+ H = Info_h.biHeight;
+ if (Info_h.biWidth % 2)
+ W++;
+
+ RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));
+
+ fread(RGB, sizeof(unsigned char), W * H, IN);
+ if (gray_scale) {
+ img->numcomps = 1;
+ img->comps =
+ (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ img->comps[0].prec = 8;
+ img->comps[0].bpp = 8;
+ img->comps[0].sgnd = 0;
+ img->comps[0].dx = subsampling_dx;
+ img->comps[0].dy = subsampling_dy;
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ for (i = 0; i < W * H; i++) {
+ if ((i % W < W - 1 && Info_h.biWidth % 2)
+ || !(Info_h.biWidth % 2))
+ fprintf(Compo0, "%c",
+ table_R[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
+ }
+ fclose(Compo0);
+ } else {
+ img->numcomps = 3;
+ img->comps =
+ (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ for (i = 0; i < img->numcomps; i++) {
+ img->comps[i].prec = 8;
+ img->comps[i].bpp = 8;
+ img->comps[i].sgnd = 0;
+ img->comps[i].dx = subsampling_dx;
+ img->comps[i].dy = subsampling_dy;
+ }
+
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ Compo1 = fopen("Compo1", "wb");
+ if (!Compo1) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
+ }
+ Compo2 = fopen("Compo2", "wb");
+ if (!Compo2) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
+ }
+
+ for (i = 0; i < W * H; i++) {
+ if ((i % W < W - 1 && Info_h.biWidth % 2)
+ || !(Info_h.biWidth % 2)) {
+ fprintf(Compo0, "%c",
+ table_R[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
+ fprintf(Compo1, "%c",
+ table_G[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
+ fprintf(Compo2, "%c",
+ table_B[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
+ }
+
+ }
+ fclose(Compo0);
+ fclose(Compo1);
+ fclose(Compo2);
+ }
+ free(RGB);
+
+ } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) {
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+
+
+
+ table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
+ table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
+ table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
+
+ for (i = 0; i < Info_h.biClrUsed; i++) {
+ table_B[i] = getc(IN);
+ table_G[i] = getc(IN);
+ table_R[i] = getc(IN);
+ getc(IN);
+ if (table_R[i] != table_G[i] && table_R[i] != table_B[i]
+ && table_G[i] != table_B[i])
+ gray_scale = 0;
+ }
+
+ /* Place the cursor at the beginning of the image information */
+ fseek(IN, 0, SEEK_SET);
+ fseek(IN, File_h.bfOffBits, SEEK_SET);
+
+ if (gray_scale) {
+ img->numcomps = 1;
+ img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
+ img->comps[0].prec = 8;
+ img->comps[0].bpp = 8;
+ img->comps[0].sgnd = 0;
+ img->comps[0].dx = subsampling_dx;
+ img->comps[0].dy = subsampling_dy;
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ } else {
+ img->numcomps = 3;
+ img->comps =
+ (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ for (i = 0; i < img->numcomps; i++) {
+ img->comps[i].prec = 8;
+ img->comps[i].bpp = 8;
+ img->comps[i].sgnd = 0;
+ img->comps[i].dx = subsampling_dx;
+ img->comps[i].dy = subsampling_dy;
+ }
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ Compo1 = fopen("Compo1", "wb");
+ if (!Compo1) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
+ }
+ Compo2 = fopen("Compo2", "wb");
+ if (!Compo2) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
+ }
+ }
+
+ RGB =
+ (unsigned char *) malloc(Info_h.biWidth * Info_h.biHeight *
+ sizeof(unsigned char));
+
+ while (not_end_file) {
+ v = getc(IN);
+ if (v) {
+ v2 = getc(IN);
+ for (i = 0; i < (int) v; i++) {
+ RGB[line * Info_h.biWidth + col] = v2;
+ col++;
+ }
+ } else {
+ v = getc(IN);
+ switch (v) {
+ case 0:
+ col = 0;
+ line++;
+ break;
+ case 1:
+ line++;
+ not_end_file = 0;
+ break;
+ case 2:
+ printf("No Delta supported\n");
+ return 1;
+ break;
+ default:
+ for (i = 0; i < v; i++) {
+ v2 = getc(IN);
+ RGB[line * Info_h.biWidth + col] = v2;
+ col++;
+ }
+ if (v % 2)
+ v2 = getc(IN);
+ }
+ }
+ }
+ if (gray_scale) {
+ for (line = 0; line < Info_h.biHeight; line++)
+ for (col = 0; col < Info_h.biWidth; col++)
+ fprintf(Compo0, "%c",
+ table_R[(int)
+ RGB[(Info_h.biHeight - line -
+ 1) * Info_h.biWidth + col]]);
+ fclose(Compo0);
+ } else {
+ for (line = 0; line < Info_h.biHeight; line++)
+ for (col = 0; col < Info_h.biWidth; col++) {
+ fprintf(Compo0, "%c",
+ table_R[(int)
+ RGB[(Info_h.biHeight - line -
+ 1) * Info_h.biWidth + col]]);
+ fprintf(Compo1, "%c",
+ table_G[(int)
+ RGB[(Info_h.biHeight - line -
+ 1) * Info_h.biWidth + col]]);
+ fprintf(Compo2, "%c",
+ table_B[(int)
+ RGB[(Info_h.biHeight - line -
+ 1) * Info_h.biWidth + col]]);
+ }
+ fclose(Compo0);
+ fclose(Compo1);
+ fclose(Compo2);
+ }
+ free(RGB);
+ } else
+ printf
+ ("Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n",
+ Info_h.biBitCount);
+
+ fclose(IN);
+ return 1;
+ }
+}
+
+ /* -->> -->> -->> -->>
+
+ PGX IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+
+unsigned char readuchar(FILE * f)
+{
+ unsigned char c1;
+ fread(&c1, 1, 1, f);
+ return c1;
+}
+
+unsigned short readushort(FILE * f, int bigendian)
+{
+ unsigned char c1, c2;
+ fread(&c1, 1, 1, f);
+ fread(&c2, 1, 1, f);
+ if (bigendian)
+ return (c1 << 8) + c2;
+ else
+ return (c2 << 8) + c1;
+}
+
+unsigned int readuint(FILE * f, int bigendian)
+{
+ unsigned char c1, c2, c3, c4;
+ fread(&c1, 1, 1, f);
+ fread(&c2, 1, 1, f);
+ fread(&c3, 1, 1, f);
+ fread(&c4, 1, 1, f);
+ if (bigendian)
+ return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
+ else
+ return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1;
+}
+
+int pgxtoimage(char *filename, j2k_image_t * img, int tdy,
+ int subsampling_dx, int subsampling_dy, int Dim[2],
+ j2k_cp_t cp)
+{
+ FILE *f;
+ int w, h, prec;
+ int i, compno, bandno;
+ char str[256], endian[16];
+ char sign;
+ int bigendian;
+ j2k_comp_t *comp;
+
+ img->numcomps = 1;
+ img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ for (compno = 0; compno < img->numcomps; compno++) {
+ FILE *src;
+ char tmp[16];
+ int max = 0;
+ int Y1;
+ comp = &img->comps[compno];
+ sprintf(str, "%s", filename);
+ f = fopen(str, "rb");
+ if (!f) {
+ fprintf(stderr, "Failed to open %s for reading !\n", str);
+ return 0;
+ }
+ if (fscanf(f, "PG %s %c %d %d %d", endian, &sign, &prec, &w, &h) == 5)
+ {
+ fgetc(f);
+ if (!strcmp(endian, "ML"))
+ bigendian = 1;
+ else
+ bigendian = 0;
+ if (compno == 0) {
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+ } else {
+ if (w != img->x1 || h != img->y1)
+ return 0;
+ }
+
+ if (sign == '-') {
+ comp->sgnd = 1;
+ } else {
+ comp->sgnd = 0;
+ }
+ comp->prec = prec;
+ comp->dx = subsampling_dx;
+ comp->dy = subsampling_dy;
+ bandno = 1;
+
+ Y1 =
+ cp.ty0 + bandno * cp.tdy <
+ img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
+ Y1 -= img->y0;
+
+ sprintf(tmp, "bandtile%d", bandno); /* bandtile file */
+ src = fopen(tmp, "wb");
+ if (!src) {
+ fprintf(stderr, "failed to open %s for writing !\n", tmp);
+ }
+ for (i = 0; i < w * h; i++) {
+ int v;
+ if (i == Y1 * w / subsampling_dy && tdy != -1) { /* bandtile is full */
+ fclose(src);
+ bandno++;
+ sprintf(tmp, "bandtile%d", bandno);
+ src = fopen(tmp, "wb");
+ if (!src) {
+ fprintf(stderr, "failed to open %s for writing !\n", tmp);
+ }
+ Y1 =
+ cp.ty0 + bandno * cp.tdy <
+ img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
+ Y1 -= img->y0;
+ }
+ if (comp->prec <= 8) {
+ if (!comp->sgnd) {
+ v = readuchar(f);
+ } else {
+ v = (char) readuchar(f);
+ }
+ } else if (comp->prec <= 16) {
+ if (!comp->sgnd) {
+ v = readushort(f, bigendian);
+ } else {
+ v = (short) readushort(f, bigendian);
+ }
+ } else {
+ if (!comp->sgnd) {
+ v = readuint(f, bigendian);
+ } else {
+ v = (int) readuint(f, bigendian);
+ }
+ }
+ if (v > max)
+ max = v;
+ fprintf(src, "%d ", v);
+ }
+ } else {
+ return 0;
+ }
+ fclose(f);
+ fclose(src);
+ comp->bpp = int_floorlog2(max) + 1;
+ }
+ return 1;
+}
+
+/* -->> -->> -->> -->>
+
+ PNM IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
+ int subsampling_dy, int Dim[2])
+{
+ FILE *f;
+ FILE *Compo0, *Compo1, *Compo2;
+ int w, h;
+ int i;
+ char value;
+ char comment[256];
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
+ filename);
+ return 0;
+ }
+
+ if (fgetc(f) != 'P')
+ return 0;
+ value = fgetc(f);
+
+ if (value == '2') {
+ fgetc(f);
+ if (fgetc(f) == '#') {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P2\n");
+ fgets(comment, 256, f);
+ fscanf(f, "%d %d\n255", &w, &h);
+ } else {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P2\n%d %d\n255", &w, &h);
+ }
+
+ fgetc(f);
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+
+ img->numcomps = 1;
+ img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
+ img->comps[0].prec = 8;
+ img->comps[0].bpp = 8;
+ img->comps[0].sgnd = 0;
+ img->comps[0].dx = subsampling_dx;
+ img->comps[0].dy = subsampling_dy;
+
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ for (i = 0; i < w * h; i++) {
+ unsigned int l;
+ fscanf(f, "%d", &l);
+ fprintf(Compo0, "%c", l);
+ }
+ fclose(Compo0);
+ } else if (value == '5') {
+ fgetc(f);
+ if (fgetc(f) == '#') {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P5\n");
+ fgets(comment, 256, f);
+ fscanf(f, "%d %d\n255", &w, &h);
+ } else {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P5\n%d %d\n255", &w, &h);
+ }
+
+ fgetc(f);
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+
+ img->numcomps = 1;
+ img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
+ img->comps[0].prec = 8;
+ img->comps[0].bpp = 8;
+ img->comps[0].sgnd = 0;
+ img->comps[0].dx = subsampling_dx;
+ img->comps[0].dy = subsampling_dy;
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+ for (i = 0; i < w * h; i++) {
+ unsigned char l;
+ fread(&l, 1, 1, f);
+ fwrite(&l, 1, 1, Compo0);
+ }
+ fclose(Compo0);
+ } else if (value == '3') {
+ fgetc(f);
+ if (fgetc(f) == '#') {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P3\n");
+ fgets(comment, 256, f);
+ fscanf(f, "%d %d\n255", &w, &h);
+ } else {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P3\n%d %d\n255", &w, &h);
+ }
+
+ fgetc(f);
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+ img->numcomps = 3;
+ img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ for (i = 0; i < img->numcomps; i++) {
+ img->comps[i].prec = 8;
+ img->comps[i].bpp = 8;
+ img->comps[i].sgnd = 0;
+ img->comps[i].dx = subsampling_dx;
+ img->comps[i].dy = subsampling_dy;
+ }
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+
+ Compo1 = fopen("Compo1", "wb");
+ if (!Compo1) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
+ }
+
+ Compo2 = fopen("Compo2", "wb");
+ if (!Compo2) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
+ }
+
+ for (i = 0; i < w * h; i++) {
+ unsigned int r, g, b;
+ fscanf(f, "%d", &r);
+ fscanf(f, "%d", &g);
+ fscanf(f, "%d", &b);
+ fprintf(Compo0, "%c", r);
+ fprintf(Compo1, "%c", g);
+ fprintf(Compo2, "%c", b);
+ }
+ fclose(Compo0);
+ fclose(Compo1);
+ fclose(Compo2);
+ } else if (value == '6') {
+ fgetc(f);
+ if (fgetc(f) == '#') {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P6\n");
+ fgets(comment, 256, f);
+ fscanf(f, "%d %d\n255", &w, &h);
+ } else {
+ fseek(f, 0, SEEK_SET);
+ fscanf(f, "P6\n%d %d\n255", &w, &h);
+ }
+
+ fgetc(f);
+ img->x0 = Dim[0];
+ img->y0 = Dim[1];
+ img->x1 =
+ !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
+ 1) *
+ subsampling_dx + 1;
+ img->y1 =
+ !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
+ 1) *
+ subsampling_dy + 1;
+ img->numcomps = 3;
+ img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
+ for (i = 0; i < img->numcomps; i++) {
+ img->comps[i].prec = 8;
+ img->comps[i].bpp = 8;
+ img->comps[i].sgnd = 0;
+ img->comps[i].dx = subsampling_dx;
+ img->comps[i].dy = subsampling_dy;
+ }
+ Compo0 = fopen("Compo0", "wb");
+ if (!Compo0) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
+ }
+
+ Compo1 = fopen("Compo1", "wb");
+ if (!Compo1) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
+ }
+
+ Compo2 = fopen("Compo2", "wb");
+ if (!Compo2) {
+ fprintf(stderr,
+ "\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
+ }
+
+ for (i = 0; i < w * h; i++) {
+ unsigned char r, g, b;
+ fread(&r, 1, 1, f);
+ fread(&g, 1, 1, f);
+ fread(&b, 1, 1, f);
+ fwrite(&r, 1, 1, Compo0);
+ fwrite(&g, 1, 1, Compo1);
+ fwrite(&b, 1, 1, Compo2);
+ }
+ fclose(Compo0);
+ fclose(Compo1);
+ fclose(Compo2);
+ } else {
+ return 0;
+ }
+ fclose(f);
+ return 1;
+}