0

我正在尝试在我的项目中包含一个 UI,它是用本机 C++ 编写的。在 VS2010 中,我添加了一个从文件中读取 .bmp 图像的 Windows 窗体。然后应将此图像的像素更改(并显示)为 int 数组中包含的值。int 数组来自一个类(在本机 c++ 中),它使用普通的 c++ fstream 操作从外部文件获取数据。这没用。编译器没有给我任何错误,但在运行时没有显示图像并且我收到错误。请看下面的代码:

PImage 类的构造函数通过从外部文件读取来初始化数组

PImage::PImage()//constructor
    {//opening original image
    ifstream OldImage;
    OldImage.open ("image.ppm", ios::in | ios::binary);

    //reading the header of the original image file
     OldImage >> Magic [0] >> Magic [1];

     OldImage >> TotRows >> TotCol >> MaxVal;

         Size = (3 * TotRows * TotCol);
        charImage = new char [Size];

         //reading the image in binary format and storing it in the array of characters
         OldImage.read(charImage, Size);

    OldImage.close();
    }

然后同一类的方法返回数组的值:

int PImage::ReturnImage(int i)
    {       
        return (int)charImage[i];
    }

这是 Windows 窗体代码:

  private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

                  try
      {


         // Retrieve the image.
         image1 = gcnew Bitmap( "image.bmp",true );

         int Size = (image1->Width * image1->Height);

         int ^intImage;
         intImage = gcnew int [Size];


         PImage intPixels;

         int index = 0;

         // Loop through the images pixels to reset color. 
         for ( int x = 0; x < image1->Width; x++ )
         {
            for ( int y = 0; y < image1->Height; y++ )
            {
               Color pixelColor = image1->GetPixel( x, y );
               Color newColor = Color::FromArgb( intPixels.ReturnImage(index), intPixels.ReturnImage(index+1), intPixels.ReturnImage(index+2));
               image1->SetPixel( x, y, newColor );
               index = index+3; 

            }

         }

         // Set the PictureBox to display the image.
         pictureBox1->Image = image1;

         // Display the pixel format in Label1.
         label1->Text = String::Format( "Image Width: {0}", image1->Width );
      }


      catch ( ArgumentException^ ) 
      {
         MessageBox::Show( "There was an error." 
         "Check the path to the image file." );
      }
         }
    };

请注意,如果我以这种方式手动编写数组的值:

int PImage::ReturnImage(int i)
{       
    charImage[i] = 100;
    return (int)charImage[i];
}

调试器捕获的问题如下:在 istream 中:

if (_Ok)
        {   // state okay, extract characters
        _TRY_IO_BEGIN
        _Meta = _Istr.rdbuf()->sbumpc();
        if (_Traits::eq_int_type(_Traits::eof(), _Meta))
            _State |= ios_base::eofbit | ios_base::failbit; // end of file
        else
            _Ch = _Traits::to_char_type(_Meta); // got a character
        _CATCH_IO_(_Istr)
        }

特别是它标记了这一行:_Ch = _Traits::to_char_type(_Meta); 说 _Ch 是未识别的值。

该程序可以正常工作,并且我可以正确显示灰色图像。我感觉从图像中读取信息的 PImage 类构造函数有问题。

任何帮助/评论/建议将不胜感激。

4

0 回答 0