2012-03-14 89 views
0

我認爲對於使用C++中的位圖的人來說,這一定是一個簡單的問題。我有我在C#中的工作代碼 - 如何在C++中做一些simillar?感謝您的代碼(幫助):-))將C#中的位圖轉換爲C++

public Bitmap Visualize() 
{ 


    PixelFormat fmt = System.Drawing.Imaging.PixelFormat.Format24bppRgb; 
    Bitmap result = new Bitmap(Width, Height, fmt); 

    BitmapData data = result.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, fmt); 
    unsafe 
    { 
    byte* ptr; 

    for (int y = 0; y < Height; y++) 
    { 
     ptr = (byte*)data.Scan0 + y * data.Stride; 

     for (int x = 0; x < Width; x++) 
     { 
      float num = 0.44; 
      byte c = (byte)(255.0f * num); 
      ptr[0] = ptr[1] = ptr[2] = c; 


      ptr += 3; 
     } 
    } 
    } 
    result.UnlockBits(data); 

    return result; 

} 

回答

1

原始翻譯爲C++/CLI,我沒有運行示例,所以它可能包含一些錯字。無論如何,有不同的方法可以在C++中獲得相同的結果(因爲您可以使用標準的CRT API)。

Bitmap^ Visualize() 
{ 
    PixelFormat fmt = System::Drawing::Imaging::PixelFormat::Format24bppRgb; 
    Bitmap^ result = gcnew Bitmap(Width, Height, fmt); 

    BitmapData^ data = result->LockBits(Rectangle(0, 0, Width, Height), ImageLockMode::ReadOnly, fmt); 
    for (int y = 0; y < Height; y++) 
    { 
    unsigned char* ptr = reinterpret_cast<unsigned char*>((data->Scan0 + y * data->Stride).ToPointer()); 

    for (int x = 0; x < Width; x++) 
    { 
     float num = 0.44f; 
     unsigned char c = static_cast<unsigned char>(255.0f * num); 
     ptr[0] = ptr[1] = ptr[2] = c; 

     ptr += 3; 
    } 
    } 

    result->UnlockBits(data); 

    return result; 

} 
0

C++不包含任何參考圖像或處理後圖像做的非常相似的循環。許多庫都可用於此目的,您對這些數據進行操作的方式可能各不相同。

在最基本的層面上,圖像由一堆字節組成。如果您只能將數據(即不包含標題或其他元數據)提取到unsigned char[](或給定圖像格式的某種其他適當類型),則可以像在C#示例中一樣遍歷每個像素。