我正在尝试在我的项目中包含一个 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 类构造函数有问题。
任何帮助/评论/建议将不胜感激。