private void WaitForImage() { ExposureStatus.BeginInvoke(new Action(() => ExposureStatus.Text = "Waiting For Image")); while (!AtikPInvoke.ArtemisImageReady(handle)) { if (stopProcessing) { stopProcessing = false; return; } Thread.Sleep(100); } int x = 0, y = 0, w = 0, h = 0, binX = 0, binY = 0; AtikPInvoke.ArtemisGetImageData(handle, ref x, ref y, ref w, ref h, ref binX, ref binY); // Create memory to copy pixels into byte[] pix = new byte[w * h * 2]; var intPtr = AtikPInvoke.ArtemisImageBuffer(handle); ExposureStatus.BeginInvoke(new Action(() => ExposureStatus.Text = "Converting")); Marshal.Copy(intPtr, pix, 0, w * h * 2); // create enough space for a 24 bit per pixel bitmap of the image byte[] bmpBytes = new byte[w * h * 3]; for (int i = 0, j = 0; i < w * h; ++i, j += 2) { if (stopProcessing) { stopProcessing = false; return; } var val = pix[j]; // we have a mono image so we place the same value into each bitmap byte bmpBytes[i] = val; bmpBytes[++i] = val; bmpBytes[++i] = val; } var pic = new Bitmap(w, h); var rect = new Rectangle(0, 0, w, h); var picData = pic.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); Marshal.Copy(bmpBytes, 0, picData.Scan0, w * 3 * h); pic.UnlockBits(picData); PictureBox.BeginInvoke(new Action(() => PictureBox.Image = pic)); ExposureStatus.BeginInvoke(new Action(() => ExposureStatus.Text = "Idle")); StartExposureButton.BeginInvoke(new Action(() => StartExposureButton.Enabled = true)); StopExposure.BeginInvoke(new Action(() => StopExposure.Enabled = false)); }
private static extern ASI_ERROR_CODE ASIGetExpStatus(int iCameraID, out ExposureStatus pExpStatus);