Fixed pink tint on thumbs, espc. Canon files
see issue 1437
This commit is contained in:
@@ -253,9 +253,6 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
|
||||
float medpt = max_f[0]+max_f[1]+max_f[2]-whitept-clippt;
|
||||
float blendpt = blendthresh*clippt;
|
||||
|
||||
float sat = ri->get_white();
|
||||
float black = ri->get_black();
|
||||
sat -= black;
|
||||
float camwb[4];
|
||||
for (int c=0; c<4; c++) camwb[c]=ri->get_cam_mul(c);
|
||||
|
||||
|
@@ -48,7 +48,7 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac
|
||||
unsigned row, col, x, y, c, sum[8];
|
||||
unsigned W = this->get_width();
|
||||
unsigned H = this->get_height();
|
||||
int val, dark, sat;
|
||||
int val, sat;
|
||||
double dsum[8], dmin, dmax;
|
||||
|
||||
for (int c = 0; c < 4; c++){
|
||||
@@ -106,19 +106,18 @@ skip_block: ;
|
||||
}
|
||||
if (pre_mul_[3] == 0)
|
||||
pre_mul_[3] = this->get_colors() < 4 ? pre_mul_[1] : 1;
|
||||
dark = this->get_black();
|
||||
sat = this->get_white();
|
||||
sat -= this->get_black();
|
||||
for (dmin = DBL_MAX, dmax = c = 0; c < 4; c++) {
|
||||
if (dmin > pre_mul_[c])
|
||||
dmin = pre_mul_[c];
|
||||
if (dmax < pre_mul_[c])
|
||||
dmax = pre_mul_[c];
|
||||
}
|
||||
|
||||
sat = this->get_white() - this->get_black();
|
||||
for (c = 0; c < 4; c++)
|
||||
scale_mul_[c] = (pre_mul_[c] /= dmax) * 65535.0 / sat;
|
||||
if (settings->verbose) {
|
||||
fprintf(stderr,"Scaling with darkness %d, saturation %d, and\nmultipliers", dark, sat);
|
||||
fprintf(stderr,"Scaling with saturation %d, and\nmultipliers", sat);
|
||||
for (c = 0; c < 4; c++)
|
||||
fprintf(stderr, " %f", pre_mul[c]);
|
||||
fputc('\n', stderr);
|
||||
@@ -204,13 +203,15 @@ int RawImage::loadRaw (bool loadData, bool closeFile)
|
||||
}
|
||||
|
||||
// Setting the black and cblack
|
||||
unsigned int i = cblack[3];
|
||||
unsigned int minBlack = cblack[3];
|
||||
for (int c=0; c <3; c++)
|
||||
if (i > cblack[c])
|
||||
i = cblack[c];
|
||||
for (int c=0; c < 4; c++)
|
||||
cblack[c] -= i;
|
||||
black += i;
|
||||
if (minBlack > cblack[c])
|
||||
minBlack = cblack[c];
|
||||
for (int c=0; c < 4; c++) cblack[c] -= minBlack;
|
||||
black += minBlack;
|
||||
for (int c=0; c < 4; c++) cblack[c] += black;
|
||||
calcBlack=black; // safe for compatibility with darkframe substraction
|
||||
black=0; // since black is already reflected in cblack now, set it to zero
|
||||
}
|
||||
|
||||
if ( closeFile ) {
|
||||
|
@@ -107,6 +107,8 @@ protected:
|
||||
char* profile_data; // Embedded ICC color profile
|
||||
unsigned short* allocation; // pointer to allocated memory
|
||||
|
||||
unsigned calcBlack; // calculated black, like DCRAW before 9.15
|
||||
|
||||
public:
|
||||
|
||||
std::string get_filename() const { return filename;}
|
||||
@@ -116,7 +118,8 @@ public:
|
||||
bool isBayer() const { return filters!=0; }
|
||||
unsigned get_filters() const { return filters; }
|
||||
int get_colors() const { return colors;}
|
||||
int get_black() const { return black;}
|
||||
int get_black() const { return black;} // from DCRAW 9.15 =0, but reflected in cblack
|
||||
int get_calcblack() const { return calcBlack;} // simulated like DCRAW before 9.15
|
||||
int get_cblack(int i) const {return cblack[i];}
|
||||
int get_white() const { return maximum;}
|
||||
unsigned short get_whiteSample( int r, int c ) const { return white[r][c];}
|
||||
|
@@ -1197,13 +1197,15 @@ void RawImageSource::HLRecovery_Global(HRecParams hrp )
|
||||
*/
|
||||
void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile )
|
||||
{
|
||||
unsigned short black=ri->get_calcblack();
|
||||
|
||||
if (ri->isBayer()) {
|
||||
if (!rawData)
|
||||
rawData = allocArray<float>(W,H);
|
||||
if (riDark && W == riDark->get_width() && H == riDark->get_height()) {
|
||||
for (int row = 0; row < H; row++) {
|
||||
for (int col = 0; col < W; col++) {
|
||||
rawData[row][col] = max(src->data[row][col]+ri->get_black() - riDark->data[row][col], 0);
|
||||
rawData[row][col] = max(src->data[row][col]+black - riDark->data[row][col], 0);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
@@ -1239,15 +1241,15 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw
|
||||
//find center ave values by channel
|
||||
for (int m=0; m<2; m++)
|
||||
for (int n=0; n<2; n++) {
|
||||
refcolor[m][n] = max(0.0f,cfablur[(2*(H>>2)+m)*W+2*(W>>2)+n] - ri->get_black());
|
||||
refcolor[m][n] = max(0.0f,cfablur[(2*(H>>2)+m)*W+2*(W>>2)+n] - black);
|
||||
}
|
||||
|
||||
for (int m=0; m<2; m++)
|
||||
for (int n=0; n<2; n++) {
|
||||
for (int row = 0; row+m < H; row+=2)
|
||||
for (int col = 0; col+n < W; col+=2) {
|
||||
vignettecorr = ( refcolor[m][n]/max(1e-5f,cfablur[(row+m)*W+col+n]-ri->get_black()) );
|
||||
rawData[row+m][col+n] = (rawData[row+m][col+n]-ri->get_black()) * vignettecorr + ri->get_black();
|
||||
vignettecorr = ( refcolor[m][n]/max(1e-5f,cfablur[(row+m)*W+col+n]-black) );
|
||||
rawData[row+m][col+n] = (rawData[row+m][col+n]-black) * vignettecorr + black;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1266,9 +1268,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw
|
||||
for (int n=0; n<2; n++) {
|
||||
for (int row = 0; row+m < H; row+=2)
|
||||
for (int col = 0; col+n < W; col+=2) {
|
||||
hlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-ri->get_black())/max(1e-5f,cfablur1[(row+m)*W+col+n]-ri->get_black()) );
|
||||
vlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-ri->get_black())/max(1e-5f,cfablur2[(row+m)*W+col+n]-ri->get_black()) );
|
||||
rawData[row+m][col+n] = ((rawData[row+m][col+n]-ri->get_black()) * hlinecorr * vlinecorr + ri->get_black());
|
||||
hlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-black)/max(1e-5f,cfablur1[(row+m)*W+col+n]-black) );
|
||||
vlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-black)/max(1e-5f,cfablur2[(row+m)*W+col+n]-black) );
|
||||
rawData[row+m][col+n] = ((rawData[row+m][col+n]-black) * hlinecorr * vlinecorr + black);
|
||||
}
|
||||
}
|
||||
free (cfablur1);
|
||||
@@ -1289,9 +1291,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw
|
||||
if (riDark && W == riDark->get_width() && H == riDark->get_height()) {
|
||||
for (int row = 0; row < H; row++) {
|
||||
for (int col = 0; col < W; col++) {
|
||||
rawData[row][3*col+0] = max(src->data[row][3*col+0]+ri->get_black() - riDark->data[row][3*col+0], 0);
|
||||
rawData[row][3*col+1] = max(src->data[row][3*col+1]+ri->get_black() - riDark->data[row][3*col+1], 0);
|
||||
rawData[row][3*col+2] = max(src->data[row][3*col+2]+ri->get_black() - riDark->data[row][3*col+2], 0);
|
||||
rawData[row][3*col+0] = max(src->data[row][3*col+0]+black - riDark->data[row][3*col+0], 0);
|
||||
rawData[row][3*col+1] = max(src->data[row][3*col+1]+black - riDark->data[row][3*col+1], 0);
|
||||
rawData[row][3*col+2] = max(src->data[row][3*col+2]+black - riDark->data[row][3*col+2], 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user