libpng cannot read an image properly
- by jonathanasdf
Here is my function... I don't know why it's not working. The resulting image looks nothing like what the .png looks like. But there's no errors either.
bool Bullet::read_png(std::string file_name, int pos)
{
png_structp png_ptr;
png_infop info_ptr;
FILE *fp;
if ((fp = fopen(file_name.c_str(), "rb")) == NULL) {
return false;
}
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fclose(fp);
return false;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
fclose(fp);
png_destroy_read_struct(&png_ptr, NULL, NULL);
return false;
}
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
return false;
}
png_init_io(png_ptr, fp);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_SWAP_ALPHA | PNG_TRANSFORM_EXPAND, NULL);
png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
imageData[pos].width = width;
imageData[pos].height = height;
png_bytepp row_pointers;
row_pointers = png_get_rows(png_ptr, info_ptr);
imageData[pos].data = new unsigned int[width*height];
for (unsigned int i=0; i < height; ++i) {
memcpy(&imageData[pos].data[i*width], &row_pointers[i], width*sizeof(unsigned int));
}
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
for (unsigned int i=0; i < height; ++i) {
for (unsigned int j=0; j < width; ++j) {
unsigned int val = imageData[pos].data[i*width+j];
if (val != 0) {
unsigned int a = ((val >> 24));
unsigned int r = (((val - (a << 24)) >> 16));
unsigned int g = (((val - (a << 24) - (r << 16)) >> 8));
unsigned int b = (((val - (a << 24) - (r << 16) - (g << 8))));
// for debugging
std::string s(AS3_StringValue(AS3_Int(i*width+j)));
s += " ";
s += AS3_StringValue(AS3_Int(val));
s += " ";
s += AS3_StringValue(AS3_Int(a));
s += " ";
s += AS3_StringValue(AS3_Int(r));
s += " ";
s += AS3_StringValue(AS3_Int(g));
s += " ";
s += AS3_StringValue(AS3_Int(b));
AS3_Trace(AS3_String(s.c_str()));
}
}
}
return true;
}
ImageData is just a simple struct to keep x, y, width, and height, and imageData is an array of that struct.
struct ImageData {
int x;
int y;
int width;
int height;
unsigned int* data;
};
Here is a side by side screenshot of the input and output graphics (something I made in a minute for testing), and this was after setting alpha to 255 in order to make it show up (because the alpha I was getting back was 1). Left side is original, right side is what happened after reading it through this function. Scaled up 400% for visibility.
Here is a log of the traces:
0 16855328 1 1 49 32
1 16855424 1 1 49 128
2 16855456 1 1 49 160
3 16855488 1 1 49 192
4 16855520 1 1 49 224
5 16855552 1 1 50 0
6 16855584 1 1 50 32
7 16855616 1 1 50 64
8 16855424 1 1 49 128
9 16855456 1 1 49 160
10 16855488 1 1 49 192
11 16855520 1 1 49 224
12 16855552 1 1 50 0
13 16855584 1 1 50 32
14 16855616 1 1 50 64
15 16855648 1 1 50 96
16 16855456 1 1 49 160
17 16855488 1 1 49 192
18 16855520 1 1 49 224
19 16855552 1 1 50 0
20 16855584 1 1 50 32
21 16855616 1 1 50 64
22 16855648 1 1 50 96
23 16855680 1 1 50 128
24 16855488 1 1 49 192
25 16855520 1 1 49 224
26 16855552 1 1 50 0
27 16855584 1 1 50 32
28 16855616 1 1 50 64
29 16855648 1 1 50 96
30 16855680 1 1 50 128
31 16855712 1 1 50 160
32 16855520 1 1 49 224
33 16855552 1 1 50 0
34 16855584 1 1 50 32
35 16855616 1 1 50 64
36 16855648 1 1 50 96
37 16855680 1 1 50 128
38 16855712 1 1 50 160
39 16855744 1 1 50 192
40 16855552 1 1 50 0
41 16855584 1 1 50 32
42 16855616 1 1 50 64
43 16855648 1 1 50 96
44 16855680 1 1 50 128
45 16855712 1 1 50 160
46 16855744 1 1 50 192
47 16855776 1 1 50 224
48 16855584 1 1 50 32
49 16855616 1 1 50 64
50 16855648 1 1 50 96
51 16855680 1 1 50 128
52 16855712 1 1 50 160
53 16855744 1 1 50 192
54 16855776 1 1 50 224
55 16855808 1 1 51 0
56 16855616 1 1 50 64
57 16855648 1 1 50 96
58 16855680 1 1 50 128
59 16855712 1 1 50 160
60 16855744 1 1 50 192
61 16855776 1 1 50 224
62 16855808 1 1 51 0
63 16855840 1 1 51 32
64 16855648 1 1 50 96
65 16855680 1 1 50 128
66 16855712 1 1 50 160
67 16855744 1 1 50 192
68 16855776 1 1 50 224
69 16855808 1 1 51 0
70 16855840 1 1 51 32
71 16855872 1 1 51 64
72 16855680 1 1 50 128
73 16855712 1 1 50 160
74 16855744 1 1 50 192
75 16855776 1 1 50 224
76 16855808 1 1 51 0
77 16855840 1 1 51 32
78 16855872 1 1 51 64
79 16855904 1 1 51 96
80 16855712 1 1 50 160
81 16855744 1 1 50 192
82 16855776 1 1 50 224
83 16855808 1 1 51 0
84 16855840 1 1 51 32
85 16855872 1 1 51 64
86 16855904 1 1 51 96
87 16855936 1 1 51 128
88 16855744 1 1 50 192
89 16855776 1 1 50 224
90 16855808 1 1 51 0
91 16855840 1 1 51 32
92 16855872 1 1 51 64
93 16855904 1 1 51 96
94 16855936 1 1 51 128
95 16855968 1 1 51 160
96 16855776 1 1 50 224
97 16855808 1 1 51 0
98 16855840 1 1 51 32
99 16855872 1 1 51 64
100 16855904 1 1 51 96
101 16855936 1 1 51 128
102 16855968 1 1 51 160
103 16856000 1 1 51 192
104 16855808 1 1 51 0
105 16855840 1 1 51 32
106 16855872 1 1 51 64
107 16855904 1 1 51 96
108 16855936 1 1 51 128
109 16855968 1 1 51 160
110 16856000 1 1 51 192
111 16856032 1 1 51 224
112 16855840 1 1 51 32
113 16855872 1 1 51 64
114 16855904 1 1 51 96
115 16855936 1 1 51 128
116 16855968 1 1 51 160
117 16856000 1 1 51 192
118 16856032 1 1 51 224
119 16856064 1 1 52 0
120 16855872 1 1 51 64
121 16855904 1 1 51 96
122 16855936 1 1 51 128
123 16855968 1 1 51 160
124 16856000 1 1 51 192
125 16856032 1 1 51 224
126 16856064 1 1 52 0
127 16856096 1 1 52 32
128 16855904 1 1 51 96
129 16855936 1 1 51 128
130 16855968 1 1 51 160
131 16856000 1 1 51 192
132 16856032 1 1 51 224
133 16856064 1 1 52 0
134 16856096 1 1 52 32
135 16856128 1 1 52 64
136 16855936 1 1 51 128
137 16855968 1 1 51 160
138 16856000 1 1 51 192
139 16856032 1 1 51 224
140 16856064 1 1 52 0
141 16856096 1 1 52 32
142 16856128 1 1 52 64
143 16856160 1 1 52 96
144 16855968 1 1 51 160
145 16856000 1 1 51 192
146 16856032 1 1 51 224
147 16856064 1 1 52 0
148 16856096 1 1 52 32
149 16856128 1 1 52 64
150 16856160 1 1 52 96
151 16856192 1 1 52 128
152 16856000 1 1 51 192
153 16856032 1 1 51 224
154 16856064 1 1 52 0
155 16856096 1 1 52 32
156 16856128 1 1 52 64
157 16856160 1 1 52 96
158 16856192 1 1 52 128
159 16856224 1 1 52 160
160 16856032 1 1 51 224
161 16856064 1 1 52 0
162 16856096 1 1 52 32
163 16856128 1 1 52 64
164 16856160 1 1 52 96
165 16856192 1 1 52 128
166 16856224 1 1 52 160
167 16856256 1 1 52 192
168 16856064 1 1 52 0
169 16856096 1 1 52 32
170 16856128 1 1 52 64
171 16856160 1 1 52 96
172 16856192 1 1 52 128
173 16856224 1 1 52 160
174 16856256 1 1 52 192
175 16856288 1 1 52 224
176 16856096 1 1 52 32
177 16856128 1 1 52 64
178 16856160 1 1 52 96
179 16856192 1 1 52 128
180 16856224 1 1 52 160
181 16856256 1 1 52 192
182 16856288 1 1 52 224
183 16856320 1 1 53 0
184 16856128 1 1 52 64
185 16856160 1 1 52 96
186 16856192 1 1 52 128
187 16856224 1 1 52 160
188 16856256 1 1 52 192
189 16856288 1 1 52 224
190 16856320 1 1 53 0
192 16856160 1 1 52 96
193 16856192 1 1 52 128
194 16856224 1 1 52 160
195 16856256 1 1 52 192
196 16856288 1 1 52 224
197 16856320 1 1 53 0
200 16856192 1 1 52 128
201 16856224 1 1 52 160
202 16856256 1 1 52 192
203 16856288 1 1 52 224
204 16856320 1 1 53 0
208 16856224 1 1 52 160
209 16856256 1 1 52 192
210 16856288 1 1 52 224
211 16856320 1 1 53 0
216 16856256 1 1 52 192
217 16856288 1 1 52 224
218 16856320 1 1 53 0
224 16856288 1 1 52 224
225 16856320 1 1 53 0
232 16856320 1 1 53 0
Was stuck on this for a couple of days.