7
Hallo Forum,
nach längerem herumexperimentieren habe ich mich dazu entschlossen, dass es nicht möglich ist, mit den mir zur Verfügung stehenden Sprachmitteln im Speicher ein Bitmap „elegant“ zusammenzubauen.
Jedoch habe ich unterdessen eine wesentlich schnellere Variante implementiert.
Sie basiert allerdings immer noch darauf, dass jedes Byte einzeln umgedreht wird. Hier ist mal ein Codeschnipsel aus dem zugehörigem Projekt – nur falls jemand mal über ein ähnliches Problem stolpert:
//ImageSampleTest
//heigth und width sind die Spalten und Zeilen des CCD Sensors
Bitmap ^bmp = gcnew Bitmap(height/2,width/2);
//hier wird erstmal jeder Pixel mit herkömmlichen Mittel auf Black gesetzt
for (counth = 0; counth < bmp->Height; counth++ ) {
for (countw = 0; countw < bmp->Width; countw++ ) {
bmp->SetPixel(countw,counth, Color::Black);
}
}
int bytes = bmp->Width * bmp->Height * 4;
int colval;
IntPtr ptr;
array<Byte>^rgbValues = gcnew array<Byte>(bytes);
System::Drawing::Rectangle rect = System::Drawing::Rectangle(0,0,bmp->Width,bmp->Height);
int counter;
while(CCD_ON) {
// an dieser Stelle befindet sich eigentlich eine Funktion, die imgarray
// mit SchwarzWeißdaten aus dem CCD Sensor überschreibt
System::Drawing::Imaging::BitmapData^ bmpData = bmp->LockBits( rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat );
ptr = bmpData->Scan0;
System::Runtime::InteropServices::Marshal::Copy( ptr, rgbValues, 0, bytes );
countw = 0;
counth = 0;
for (counter = 0; counter < rgbValues->Length; counter += 4 ){
//jedes “bytequartet” im byte- array muss nun als Punkt identifiziert und // mit einem Farbwert versehen werden
colval = imgarray[counth,countw]*255/4000;
counth += 2;
if(counth > height-1) {
counth = 0;
countw += 2;
}
if(countw > width-1) countw = width-2;
rgbValues[counter ] = colval;
rgbValues[counter + 1] = colval;
rgbValues[counter + 2] = colval;
}
System::Runtime::InteropServices::Marshal::Copy( rgbValues, 0, ptr, bytes );
bmp->UnlockBits( bmpData );
pictureBox1->Image = bmp;
pictureBox1->Update();
}
Dieses Programmschnipsel stellt mit dem DualCore Rechner, auf dem es läuft ca. alle 1 ms ein neues Bild zur Verfügung. Warum die SetPixel Methode so langsam ist, ist mir allerdings nicht klar.
MfG.