2017-04-08 3 views
1

目的は、ファイルからロードされたビットマップの各画素のR、G、B値を取得し、10GDIPlusの::ビットマップブライトニング画像C++次の関数の

void PerformTransformation(Gdiplus::Bitmap* bitmap, LPCTSTR SaveFileName) { 
    Gdiplus::BitmapData* bitmapData = new Gdiplus::BitmapData; 
    UINT Width = bitmap->GetWidth(); 
    UINT Height = bitmap->GetHeight(); 
    Gdiplus::Rect rect(0, 0,Width,Height); 
    bitmap->LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, bitmapData); 


    byte* pixels = (byte*)bitmapData->Scan0; 
    INT iStride = abs(bitmapData->Stride); 

    for (UINT col = 0; col < Width; ++col) 
     for (UINT row = 0; row < Height; ++row) 
     { 

      unsigned int curColor = pixels[row * iStride/4 + col]; 
      int b = curColor & 0xff; 
      int g = (curColor & 0xff00) >> 8; 
      int r = (curColor & 0xff0000) >> 16;    
      if ((r + 10) > 255) r = 255; else r += 10; 
      if ((g + 10) > 255) g = 255; else g += 10; 
      if ((b + 10) > 255) b = 255; else b += 10; 

      pixels[curColor & 0xff ] = b; 
      pixels[curColor & 0xff00 >> 8] = g; 
      pixels[curColor & 0xff0000 >> 16] = r; 

     } 

    bitmap->UnlockBits(bitmapData);    
    CLSID pngClsid; 
    GetEncoderClsid(L"image/png", &pngClsid); 
    bitmap->Save(SaveFileName, &pngClsid, NULL);  
} 

しかし場合によってそれらを増加させることです保存ファイルをチェックすると、明るさは増加していません。私は各R、G、Bの値をそれぞれ100に更新するために値を増やそうとしましたが、画像は同じままです。新しい値を正しく設定していないようです。

誰かが間違っていることを私に見せてもらえますか?

編集: いくつかの指針に従えば、画像が明るくなりますが、画像の1/4が明るくなります。

enter image description here

変更されたコード

void PerformTransformation(Gdiplus::Bitmap* bitmap, LPCTSTR SaveFileName) { 
    Gdiplus::BitmapData* bitmapData = new Gdiplus::BitmapData; 
    UINT Width = bitmap->GetWidth(); 
    UINT Height = bitmap->GetHeight(); 
    Gdiplus::Rect rect(0, 0,Width,Height); 
    // Lock a 5x3 rectangular portion of the bitmap for reading. 
    bitmap->LockBits(&rect, Gdiplus::ImageLockModeWrite, 
PixelFormat32bppARGB, bitmapData); 

    byte* Pixels = (byte*)bitmapData->Scan0; 
    INT stride_bytes_count = abs(bitmapData->Stride); 
    UINT row_index, col_index; 
    byte pixel[4]; 
    for (col_index = 0; col_index < Width; ++col_index) { 
     for (row_index = 0; row_index < Height; ++row_index) 
     { 

      unsigned int curColor = Pixels[row_index * stride_bytes_count/
4 + col_index]; 
      int b = curColor & 0xff; 
      int g = (curColor & 0xff00) >> 8; 
      int r = (curColor & 0xff0000) >> 16; 
      if ((r + 10) > 255) r = 255; else r += 10; 
      if ((g + 10) > 255) g = 255; else g += 10; 
      if ((b + 10) > 255) b = 255; else b += 10; 


      pixel[0] = b; 
      pixel[1] = g; 
      pixel[2] = r; 
      Pixels[row_index * stride_bytes_count/4 + col_index] = *pixel; 
     } 
    } 



    bitmap->UnlockBits(bitmapData);  
    ::DeleteObject(bitmapData); 
    CLSID pngClsid; 
    GetEncoderClsid(L"image/png", &pngClsid); 
    bitmap->Save(SaveFileName, &pngClsid, NULL);  
    } 

}; 
+0

を削除決して削除'pixels [...]'で始まる3行を 'pixels [row * iStride/4 + col] = r |で始まる1行に置き換えます。 (g << 8)| (b << 16) –

+0

PixelFormat32bppARGBをお願いしましたが、それは良いアイデアですが、ピクセルは1バイトではなく4バイトになります。だからあなたは 'byte * 'ではなく' UINT * 'でそれを扱わなければなりません。 –

+0

ありがとうございました。しかしアイデアを保存したときにイメージが常に黒であることが変更されました。 –

答えて

0
  • あなたはリターンコードをチェックすることはありません。あなたは色値の画素により画素チャンネル値をインデックスさ
  • あなたはモード(のGdiPlus :: ImageLockModeRead)を読み出すビットマップデータにアクセス
  • [curColor &は0xFF]
  • あなたが割り当てられたBitmapDataオブジェクトを
+0

こんにちは、ありがとう、今変更されます!また、この場合ピクセルチャネルの値をどのようにインデックスする必要がありますか? –

+0

ピクセルをbyte [4]の配列として定義し、各ピクセル書き込み後(次のピクセルに移動する)と各ストライド終了後(次のストライドの最初のピクセルに移動する)にインクリメントするピクセルイテレータを処理します。 – dodo951

+0

この場合、変数の行はピクセルイテレータですか? –

関連する問題