private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { //輝度値の取得、設定(二値化) int i, j; int Bright; //モノクロ輝度値 int B, G, R;//カラー輝度値 int BitCount; int Step; Byte Threshold; //しきい値の取得 bool result = Byte::TryParse(textBox1->Text, Threshold); if (result == false) return; //輝度値を取得、設定する領域 Rectangle rect = System::Drawing::Rectangle(0, 0, bmp->Width, bmp->Height); //Lock Imaging::BitmapData^ bmpData = bmp->LockBits(rect, Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat); //ビットマップデータのメモリのポインタ Byte* pBuf = (Byte*)bmpData->Scan0.ToPointer(); //画像データのビット数 BitCount = bmp->GetPixelFormatSize(bmp->PixelFormat); //輝度値の取得、設定 switch (bmp->PixelFormat){ case Imaging::PixelFormat::Format8bppIndexed: //8ビットデータの場合 for (j = 0; j < rect.Height; j++){ for (i = 0; i < rect.Width; i++){ //輝度値の取得 Bright = pBuf[i + j * bmpData->Stride]; //輝度値の設定(二値化) if (Bright >= Threshold) pBuf[i + j * bmpData->Stride] = 255; //白に設定 else pBuf[i + j * bmpData->Stride] = 0; //黒に設定 } } break; case Imaging::PixelFormat::Format24bppRgb: //24ビットカラーデータの場合 //輝度値はB,G,R,B,G,R・・・の順で格納されています。 case Imaging::PixelFormat::Format32bppRgb: //32ビットカラーデータの場合 //輝度値はB,G,R,A,B,G,R,A・・・の順で格納されています。 Step = BitCount / 8; for (j = 0; j < rect.Height; j++){ for (i = 0; i < rect.Width; i++){ //輝度値の取得 B = pBuf[i * Step + j * bmpData->Stride]; //青 G = pBuf[i * Step + 1 + j * bmpData->Stride]; //緑 R = pBuf[i * Step + 2 + j * bmpData->Stride]; //赤 //輝度値の設定(二値化) if ((B >= Threshold) || (G >= Threshold) || (R >= Threshold)){ pBuf[i * Step + j * bmpData->Stride] = 255; //青 pBuf[i * Step + 1 + j * bmpData->Stride] = 255; //緑 pBuf[i * Step + 2 + j * bmpData->Stride] = 255; //赤 }else{ pBuf[i * Step + j * bmpData->Stride] = 0; //青 pBuf[i * Step + 1 + j * bmpData->Stride] = 0; //緑 pBuf[i * Step + 2 + j * bmpData->Stride] = 0; //赤 } } } break; default: MessageBox::Show("未対応ファイルフォーマットです。"); bmp->UnlockBits(bmpData); return; } //UnLock bmp->UnlockBits(bmpData); //ピクチャボックスへ画像の表示 pictureBox1->Image = bmp; } |