74 pixel.reset(
new uint8_t [size]);
76 memcpy(
pixel.get(),
reinterpret_cast<uint8_t *
>(buffer->
getBase(part)), size);
91 inline unsigned char clamp8(
int v)
93 const int v2=v<0 ? 0:v;
94 return static_cast<unsigned char>(v2>255 ? 255:v2);
101 const uint32_t j=
static_cast<uint32_t
>((i>>2)*6);
102 const uint32_t js=
static_cast<uint32_t
>(i&0x3);
110 const int Cb=
static_cast<int>(row[j+2])-128;
111 const int Cr=
static_cast<int>(row[j+5])-128;
114 const int rc=((90*Cr+16384+32)>>6)-256;
115 const int gc=((-22*Cb-46*Cr+16384+32)>>6)-256;
116 const int bc=((113*Cb+16384+32)>>6)-256;
127 const int Y[4]={row[i], row[i+1], row[i+3], row[i+4]};
128 const int Cb=
static_cast<int>(row[i+2])-128;
129 const int Cr=
static_cast<int>(row[i+5])-128;
132 const int rc=((90*Cr+16384+32)>>6)-256;
133 const int gc=((-22*Cb-46*Cr+16384+32)>>6)-256;
134 const int bc=((113*Cb+16384+32)>>6)-256;
136 for (
int j=0; j<4; j++)
138 *rgb++=clamp8(Y[j]+rc);
139 *rgb++=clamp8(Y[j]+gc);
140 *rgb++=clamp8(Y[j]+bc);
146 const uint32_t j=
static_cast<uint32_t
>((i>>1)*4);
147 const uint32_t js=
static_cast<uint32_t
>(i&0x1)*2;
149 const int Y=row[j+js];
150 const int Cb=
static_cast<int>(row[j+1])-128;
151 const int Cr=
static_cast<int>(row[j+3])-128;
154 const int rc=((90*Cr+16384+32)>>6)-256;
155 const int gc=((-22*Cb-46*Cr+16384+32)>>6)-256;
156 const int bc=((113*Cb+16384+32)>>6)-256;
167 for (
int k=0; k<8; k+=4)
169 const int Y[2]={row[i+k], row[i+2+k]};
170 const int Cb=
static_cast<int>(row[i+1+k])-128;
171 const int Cr=
static_cast<int>(row[i+3+k])-128;
174 const int rc=((90*Cr+16384+32)>>6)-256;
175 const int gc=((-22*Cb-46*Cr+16384+32)>>6)-256;
176 const int bc=((113*Cb+16384+32)>>6)-256;
178 for (
int j=0; j<2; j++)
180 *rgb++=clamp8(Y[j]+rc);
181 *rgb++=clamp8(Y[j]+gc);
182 *rgb++=clamp8(Y[j]+bc);
187 void getColor(uint8_t rgb[3],
const std::shared_ptr<const Image> &img,
188 uint32_t ds, uint32_t i, uint32_t k)
196 if (img->getPixelFormat() ==
Mono8)
198 size_t lstep=img->getWidth()+img->getXPadding();
199 const uint8_t *p=img->getPixels()+k*lstep+i;
203 for (uint32_t kk=0; kk<ds; kk++)
205 for (uint32_t ii=0; ii<ds; ii++)
214 rgb[2]=rgb[1]=rgb[0]=
static_cast<uint8_t
>(g/n);
216 else if (img->getPixelFormat() ==
RGB8)
218 size_t lstep=3*img->getWidth()+img->getXPadding();
219 const uint8_t *p=img->getPixels()+k*lstep+3*i;
226 for (uint32_t kk=0; kk<ds; kk++)
229 for (uint32_t ii=0; ii<ds; ii++)
240 rgb[0]=
static_cast<uint8_t
>(r/n);
241 rgb[1]=
static_cast<uint8_t
>(g/n);
242 rgb[2]=
static_cast<uint8_t
>(b/n);
246 size_t lstep=(img->getWidth()>>2)*6+img->getXPadding();
247 const uint8_t *p=img->getPixels()+k*lstep;
254 for (uint32_t kk=0; kk<ds; kk++)
256 for (uint32_t ii=0; ii<ds; ii++)
270 rgb[0]=
static_cast<uint8_t
>(r/n);
271 rgb[1]=
static_cast<uint8_t
>(g/n);
272 rgb[2]=
static_cast<uint8_t
>(b/n);
276 size_t lstep=(img->getWidth()>>2)*8+img->getXPadding();
277 const uint8_t *p=img->getPixels()+k*lstep;
284 for (uint32_t kk=0; kk<ds; kk++)
286 for (uint32_t ii=0; ii<ds; ii++)
300 rgb[0]=
static_cast<uint8_t
>(r/n);
301 rgb[1]=
static_cast<uint8_t
>(g/n);
302 rgb[2]=
static_cast<uint8_t
>(b/n);
313 inline void convertGreenGR(uint8_t &r, uint8_t &g, uint8_t &b,
314 const uint8_t *&row0,
const uint8_t *&row1,
const uint8_t *&row2)
316 r=
static_cast<uint8_t
>((
static_cast<int>(*row1)+row1[2]+1)>>1);
318 b=
static_cast<uint8_t
>((
static_cast<int>(row0[1])+row2[1]+1)>>1);
320 row0++; row1++; row2++;
327 inline void convertGreenGB(uint8_t &r, uint8_t &g, uint8_t &b,
328 const uint8_t *&row0,
const uint8_t *&row1,
const uint8_t *&row2)
330 r=
static_cast<uint8_t
>((
static_cast<int>(row0[1])+row2[1]+1)>>1);
332 b=
static_cast<uint8_t
>((
static_cast<int>(*row1)+row1[2]+1)>>1);
334 row0++; row1++; row2++;
341 inline void convertRed(uint8_t &r, uint8_t &g, uint8_t &b,
342 const uint8_t *&row0,
const uint8_t *&row1,
const uint8_t *&row2)
345 g=
static_cast<uint8_t
>((
static_cast<int>(row0[1])+row2[1]+*row1+row1[2]+2)>>2);
346 b=
static_cast<uint8_t
>((
static_cast<int>(*row0)+row0[2]+*row2+row2[2]+2)>>2);
348 row0++; row1++; row2++;
355 inline void convertBlue(uint8_t &r, uint8_t &g, uint8_t &b,
356 const uint8_t *&row0,
const uint8_t *&row1,
const uint8_t *&row2)
358 r=
static_cast<uint8_t
>((
static_cast<int>(*row0)+row0[2]+*row2+row2[2]+2)>>2);
359 g=
static_cast<uint8_t
>((
static_cast<int>(row0[1])+row2[1]+*row1+row1[2]+2)>>2);
362 row0++; row1++; row2++;
369 inline uint8_t rgb2Grey(uint8_t r, uint8_t g, uint8_t b)
371 return static_cast<uint8_t
>((9798*
static_cast<uint32_t
>(r)+
372 19234*
static_cast<uint32_t
>(g)+
373 3736*
static_cast<uint32_t
>(b)+16384)>>15);
376 inline void storeRGBMono(uint8_t *&rgb_out, uint8_t *&mono_out, uint8_t red, uint8_t green,
388 *mono_out++ = rgb2Grey(red, green, blue);
396 void convertBayerGR(uint8_t *rgb_out, uint8_t *mono_out,
397 const uint8_t *row0,
const uint8_t *row1,
const uint8_t *row2,
398 bool greenfirst,
size_t width)
400 uint8_t red, green, blue;
408 convertGreenGR(red, green, blue, row0, row1, row2);
409 storeRGBMono(rgb_out, mono_out, red, green, blue);
418 convertRed(red, green, blue, row0, row1, row2);
419 storeRGBMono(rgb_out, mono_out, red, green, blue);
423 convertGreenGR(red, green, blue, row0, row1, row2);
424 storeRGBMono(rgb_out, mono_out, red, green, blue);
433 convertRed(red, green, blue, row0, row1, row2);
434 storeRGBMono(rgb_out, mono_out, red, green, blue);
442 void convertBayerGB(uint8_t *rgb_out, uint8_t *mono_out,
443 const uint8_t *row0,
const uint8_t *row1,
const uint8_t *row2,
444 bool greenfirst,
size_t width)
446 uint8_t red, green, blue;
454 convertGreenGB(red, green, blue, row0, row1, row2);
455 storeRGBMono(rgb_out, mono_out, red, green, blue);
464 convertBlue(red, green, blue, row0, row1, row2);
465 storeRGBMono(rgb_out, mono_out, red, green, blue);
469 convertGreenGB(red, green, blue, row0, row1, row2);
470 storeRGBMono(rgb_out, mono_out, red, green, blue);
479 convertBlue(red, green, blue, row0, row1, row2);
480 storeRGBMono(rgb_out, mono_out, red, green, blue);
486 bool convertImage(uint8_t *rgb_out, uint8_t *mono_out,
const uint8_t *raw, uint64_t pixelformat,
487 size_t width,
size_t height,
size_t xpadding)
497 for (
size_t k=0; k<height; k++)
501 for (
size_t i=0; i<
width; i++)
512 std::memcpy(mono_out, raw,
width*
sizeof(uint8_t));
523 size_t pstep=(
width>>2)*6+xpadding;
524 for (
size_t k=0; k<height; k++)
526 for (
size_t i=0; i<
width; i+=4)
533 for (
int j=0; j<12; j++)
542 *mono_out++ = raw[j];
543 *mono_out++ = raw[j+1];
544 *mono_out++ = raw[j+3];
545 *mono_out++ = raw[j+4];
557 size_t pstep=(
width>>2)*8+xpadding;
558 for (
size_t k=0; k<height; k++)
560 for (
size_t i=0; i<
width; i+=4)
567 for (
int j=0; j<12; j++)
576 *mono_out++ = raw[j];
577 *mono_out++ = raw[j+2];
578 *mono_out++ = raw[j+4];
579 *mono_out++ = raw[j+6];
590 for (
size_t k=0; k<height; k++)
594 std::memcpy(rgb_out, raw, 3*
width*
sizeof(uint8_t));
601 for (
size_t i=0; i<
width; i++)
603 *mono_out++ = rgb2Grey(raw[j], raw[j+1], raw[j+2]);
608 raw+=3*
width+xpadding;
627 std::unique_ptr<uint8_t []> buffer(
new uint8_t [(
width+2)*3]);
631 row[1]=row[0]+
width+2;
632 row[2]=row[1]+
width+2;
637 memcpy(row[1]+1, raw+
width+xpadding,
width*
sizeof(uint8_t));
638 memcpy(row[2]+1, raw,
width*
sizeof(uint8_t));
640 row[1][0]=row[1][2]; row[1][
width+1]=row[1][
width-1];
641 row[2][0]=row[2][2]; row[2][
width+1]=row[2][
width-1];
645 for (
size_t k=0; k<height; k++)
656 memcpy(row[2]+1, raw+(k+1)*(
width+xpadding),
width*
sizeof(uint8_t));
658 row[2][0]=row[2][2]; row[2][
width+1]=row[2][
width-1];
663 convertBayerGR(rgb_out, mono_out, row[0], row[1], row[2], greenfirst,
width);
665 if (rgb_out) rgb_out+=3*
width;
666 if (mono_out) mono_out+=
width;
670 convertBayerGB(rgb_out, mono_out, row[0], row[1], row[2], greenfirst,
width);
672 if (rgb_out) rgb_out+=3*
width;
673 if (mono_out) mono_out+=
width;
676 greenfirst=!greenfirst;