BCB:影像多次處理後會跑掉

遭遇問題
影像多次處理後會跑掉,是今天re-code專題程式發現的詭異情況,只知道,詳細原因不明,因為這個問題害我損失很多時間。

實驗開始
開啟一個圖檔,三個Image物件分別Load同一個檔案,之後每按一次實驗按鈕,就重新指定Image的所有像素值,詳見實驗碼。

  1. 圖1、左邊的Image,直接針對Image設定pixel數值。
  2. 圖2、中間的Image,在Bitmap上完成設定,在設定給Image物件。
  3. 圖3、右邊的Image,拿完成設定的bitmap給Image繪圖。
按下第一次的結果與還沒運行的結果相同。
按下第二次的結果,中間直接設定Bitmap給Image的開始扭曲第三次的結果更是糟糕
第十次的結果就不用說了,整個就是不能看了

實驗程式碼
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  BYTE* pptr;
  int h,w;
  // Image1
  for (h=Image1->Height-1 ; h>=0 ; --h)
  {
    pptr =(BYTE*)Image1->Picture->Bitmap->ScanLine[h];
    for (w=0 ; w<Image1->Width ; ++w)
    {
      Image1->Canvas->Pixels[w][h] =
        (TColor)RGB(pptr[w*3+2],pptr[w*3+1],pptr[w*3]);
    }
  }

  // Image2
  Graphics::TBitmap *bmp = new Graphics::TBitmap();
  bmp->Width  = Image2->Width;
  bmp->Height = Image2->Height;
  for (h=Image2->Height-1 ; h>=0 ; --h)
  {
    pptr =(BYTE*)Image2->Picture->Bitmap->ScanLine[h];
    for (w=0 ; w<Image2->Width ; ++w)
    {
      bmp->Canvas->Pixels[w][h] =
        (TColor)RGB(pptr[w*3+2],pptr[w*3+1],pptr[w*3]);
    }
  }
  Image2->Picture->Graphic = bmp;
  delete bmp;

  // Image3
  Graphics::TBitmap *bmp2 = new Graphics::TBitmap();
  bmp2->Width = Image3->Width;
  bmp2->Height = Image3->Height;
  for (h=Image3->Height-1 ; h>=0 ; --h)
  {
    pptr =(BYTE*)Image3->Picture->Bitmap->ScanLine[h];
    for (w=0 ; w<Image3->Width ; ++w)
    {
      bmp2->Canvas->Pixels[w][h] =
        (TColor)RGB(pptr[w*3+2],pptr[w*3+1],pptr[w*3]);
    }
  }
  Image3->Canvas->Draw(0,0,bmp2);
  delete bmp2;
}
結論
結論就是我還沒有結論(倒)
目前只能避開這個因素,要作影像的處理就要用畫的,或是直接在Imag物件上作改變。

留言

匿名表示…
感謝您的程式碼分享!
在Image2中,可在設定width和height之後,
再加下列一行程式碼,設定pixel深度為24 bits,
就可避免問題產生。

bmp->PixelFormat = pf24bit;
匿名表示…
若為8位元影像,則PixelFormat設定為pf8bit,

若為24位元影像,則設為pf24bit。