写真を撮ったのです。
ところがコートが黒だったので、逆光で顔がつぶれてしまいました。
どこかのサービスで明るくした写真を作ったら、空が白くなって、東京タワーも朱色になってしまいました。
これはなさけない。
HDR
デジタルカメラを使った写真では、High Dynamic Rangeといって、露出の異なる複数の写真を合成して、ダイナミックレンジの向上した写真を撮影できるようになっています。
ところが、このHDRはフリーのサービスがあまりないうえに、使う写真は3枚以上とかで、今回の条件、すなわち写真が2枚、しかも露出を変えて撮影したのではなくて、撮ったあとに露出を変えた写真があるだけ、というのでは、そもそもHDRを構成する要素を満たしていないようです。
そこで、それなら自前でやってみようと考えました。
OriginalHDR
白飛びしている空の部分にはオリジナルを使い、それ以外の部分は、加工ずみの明るい写真を使います。
空飛びとは、RGBのうち、Rが200以上、Gが200以上、Bが215以上の色をいうようです。ざっくり。
bool IsFirstPhoto = true;
Bitmap FirstImage;
private void HDR(string path) {
//最初に暗い写真を読む。
if (IsFirstPhoto) {
FirstImage = new Bitmap(path);
IsFirstPhoto = false;
return;
}
Bitmap SecondImage = new Bitmap(path);
Bitmap aftertheImage = new Bitmap(SecondImage, SecondImage.Width, SecondImage.Height);
for (int Y = 0; Y < SecondImage.Height; Y++) {
for (int X = 0; X < SecondImage.Width; X++) {
int pixcelData = SecondImage.GetPixel(X, Y).ToArgb();
Color pixcelARGB = Color.FromArgb(pixcelData);
int red = pixcelARGB.R;
int green = pixcelARGB.G;
int blue = pixcelARGB.B;
Color sky = Color.FromArgb(0, 200, 200, 215);
if (sky.R < red &&
sky.G < green &&
sky.B < blue) {
pixcelData = FirstImage.GetPixel(X, Y).ToArgb();
pixcelARGB = Color.FromArgb(pixcelData);
}
aftertheImage.SetPixel(X, Y, pixcelARGB);
}
}
string saveFolder = Path.GetDirectoryName(path);
string savefileName = saveFolder + @"\" + DateTime.Now.ToString("yyyy_MMdd_HHmm_ss") + ".png";
aftertheImage.Save(savefileName, System.Drawing.Imaging.ImageFormat.Png);
}