0

これは私のコードの一部であり、ファイルを削除したいと思います(12行目)。

ただし、エラーが発生します。ファイルは、whileループの2回目で、c#の別のプロセスによって使用されているため、プロジェクトはファイルにアクセスできません。私はすべてのオブジェクトを破棄して閉じました。

while (true)
{
    string strEncrypted;
    int strLenght = 0;
    byte[] cryptedRGB;

    string imgCamFile = Environment.CurrentDirectory + "\\___imgCam\\_sentImg\\__empImg.bmp";
    if (File.Exists(@imgCamFile))
    {
        lock (@imgCamFile)
        {
            //if (camPictureBox.Image != null)
            //    camPictureBox.Image.Dispose();
            GC.Collect();
            System.IO.File.Delete(@imgCamFile);
            GC.Collect();
        }
    }

    strDataType = System.Text.Encoding.UTF8.GetBytes("Frame");
    strEncrypted = clsCryption.Encrypt("Frame");

    strDataType = new byte[strEncrypted.Length];
    foreach (char c in strEncrypted.ToCharArray())
    {
        strDataType[strLenght] = (byte)c;
        strLenght++;
    }
    if (optClient.Checked == true)
        mClient.Send(strDataType);
    else if (optServer.Checked == true)
        mServerHandler.Send(strDataType);

    MemoryStream Ms = new MemoryStream();
    camPictureBox.Image.Save(Ms, System.Drawing.Imaging.ImageFormat.Bmp);
    byte[] mData = Ms.GetBuffer();
    Ms.Close();
    Ms.Dispose();

    FileStream fileStream = new FileStream(imgCamFile, FileMode.Create, FileAccess.Write);
    fileStream.Write(mData, 0, mData.Length);
    fileStream.Close();
    fileStream.Dispose();

    Bitmap bitmap = new Bitmap(imgCamFile);
    Size mS = bitmap.Size;

    string[,] RGB = new string[mS.Width * 3, mS.Height];
    int realWodth = mS.Width * 3;
    byte[] myRGB = new byte[realWodth * mS.Height];

    int cCounter = 0;
    int pRow = 0;

    for (int y = 0; y < mS.Height; y++)
    {
        cCounter = 0;
        for (int x = 0; x < mS.Width; x++)
        {
            Color pixColor = bitmap.GetPixel(x, y);

            RGB[cCounter, y] = pixColor.R.ToString(); ++cCounter;
            RGB[cCounter, y] = pixColor.G.ToString(); ++cCounter;
            RGB[cCounter, y] = pixColor.B.ToString(); ++cCounter;

            myRGB[pRow] = Byte.Parse(pixColor.R.ToString()); pRow++;
            myRGB[pRow] = Byte.Parse(pixColor.G.ToString()); pRow++;
            myRGB[pRow] = Byte.Parse(pixColor.B.ToString()); pRow++;
        }

    }

    int sent;
    if (optClient.Checked == true)
        sent = SendVarData(mClient, myRGB);
    else if (optServer.Checked == true)
        sent = SendVarData(mServerHandler, myRGB);

    System.Threading.Thread.Sleep(4000);
}
4

3 に答える 3

0

私はこれが問題だと信じています:

 Bitmap bitmap = new Bitmap(imgCamFile);

ビットマップをnullに設定しないでください。これにより、パスがロックされたままになります。

于 2012-10-03T21:25:41.080 に答える
0

イムホ、同意します。ガベージコレクターを呼び出さないでください。C#はそれを自動的に行う必要があります。すべてのオブジェクトを破棄してリソースを解放するだけです。

これは必要ないことに注意してください。

Ms.Close();
Ms.Dispose();

fileStream.Close();
fileStream.Dispose();

disposeは暗黙的にcloseを呼び出すためです。

Bitmapクラスを使用した後、リソースを解放します。

Bitmap bitmap = new Bitmap(imgCamFile); 
bitmap.Dispose();
于 2012-10-03T21:34:00.667 に答える
0

なぜすべてのステップ? Image -> MemoryStream -> FileStream -> BitMap

BitmapImage-です-camPictureBox.ImageまだではなくBitmap、代わりに計算を行うことはできませんか?

そうでない場合...

using(var bitmap = new Bitmap(camPictureBox.Image))
{
   // do your calculations
}

... また ...

using (var ms = new MemoryStream())
{
   camPictureBox.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

   using (var bitmap = new Bitmap(ms))
   {
       // do your work
   }
}
于 2012-10-03T22:02:35.200 に答える