public static double compare(MyFilterData left, MyFilterData right, CRITERIA_METHOD criteria) {// return value high means the right is not like left double rate = 0.0; switch (criteria) { case CRITERIA_METHOD.ABSOLUTE: for (int j = 0; j < left.size; j++) { for (int i = 0; i < left.size; i++) { rate += (Math.Abs(left[i, j][0] - right[i, j][0]) + Math.Abs(left[i, j][1] - right[i, j][1]) + Math.Abs(left[i, j][2] - right[i, j][2])) / 3; } } break; case CRITERIA_METHOD.SQUARE: for (int j = 0; j < left.size; j++) { for (int i = 0; i < left.size; i++) { rate += (Math.Pow(left[i, j][0] - right[i, j][0], 2) + Math.Pow(left[i, j][1] - right[i, j][1], 2) + Math.Pow(left[i, j][2] - right[i, j][2], 2)) / 3; } } break; } return(rate); }
protected void interSubsample() { compressFile.type = MyCompressTiffDefine.TYPE.SUBSAMPLE; if (RefPlayer != null) { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(0, MyPlayer.PlayState.KEEP)); CurPlayer.Tiff = RefPlayer.Tiff; MyFilterData CurKernelGet = new MyFilterData(); // the data copy from cur frame of kernel size for (int i = 0; i < RefPlayer.Tiff.Size; i++) { //run frames //Debug.Print("in frame " + i); trackBar.Invoke(new threadHandler2(progressTrack), i); // reflash progress view CurPlayer.OnPlay(new MyPlayer.PlayEventArgs(i)); //flash current frame view if ((i % 2 == 0) || (i == (RefPlayer.Tiff.Size - 1))) { //uncompress frame number compressFile.baseImg.Add((Image)RefPlayer.Tiff[i].Clone()); // add ref imge compressFile.motionTiff.Add(null); continue; } else { compressFile.baseImg.Add(null);// add ref imge compressFile.motionTiff.Add(null); continue; } } if (activeFrom != null) { activeFrom.Invoke(new threadHandler(saveFile));// save the result } } }
public static double compare(MyFilterData left, MyFilterData right) {// return value high means the right is not like left double rate = 0.0; for (int j = 0; j < left.size; j++) { for (int i = 0; i < left.size; i++) { rate += (Math.Pow(left[i, j][0] - right[i, j][0], 2) + Math.Pow(left[i, j][1] - right[i, j][1], 2) + Math.Pow(left[i, j][2] - right[i, j][2], 2)) / 3; } } return(rate); }
public static MyFilterData add(MyFilterData left, MyFilterData right) { MyFilterData newFilterData = new MyFilterData(left.size); for (int j = 0; j < newFilterData.size; j++) { for (int i = 0; i < newFilterData.size; i++) { newFilterData[i, j] = new double[3]; newFilterData[i, j][0] = left[i, j][0] + right[i, j][0]; newFilterData[i, j][1] = left[i, j][1] + right[i, j][1]; newFilterData[i, j][2] = left[i, j][2] + right[i, j][2]; } } return(newFilterData); }
public byte[] count(double rate) {// sigma each pixel in _data (rate*pixel) byte[] output = new byte[3]; double[] temp = new double[3]; foreach (double[] pixel in _data) { if (pixel != null) { temp[0] += pixel[0]; temp[1] += pixel[1]; temp[2] += pixel[2]; } } temp[0] *= rate; temp[1] *= rate; temp[2] *= rate; output = MyFilterData.boundPixel(temp); return(output); }
public static Bitmap decode(Bitmap baseImg, MyMotionTiff motion) { MyFilter filter = new MyFilter(MyCompresser.compressKernelSize); filter.setData(1); Bitmap newImg = new Bitmap(baseImg.Width, baseImg.Height); BitmapData baseData = baseImg.LockBits(MyDeal.boundB(baseImg), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); BitmapData newData = newImg.LockBits(MyDeal.boundB(newImg), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); MyFilterData srcFilterData = new MyFilterData(); for (int y = 0 + MyCompresser.compressKernelSize / 2; y < motion.Height; y += MyCompresser.compressKernelSize) { for (int x = 0 + MyCompresser.compressKernelSize / 2; x < motion.Width; x += MyCompresser.compressKernelSize) { srcFilterData.fill(baseData, motion[x, y][0], motion[x, y][1], MyFilter.BorderMethod.ZERO, filter); Debug.Print("the " + x + " , " + y + " from " + motion[x, y][0] + " , " + motion[x, y][1]); unsafe { byte *dstPtr = (byte *)newData.Scan0; int skipByte = newData.Stride - 3 * MyCompresser.compressKernelSize; dstPtr += (y - MyCompresser.compressKernelSize / 2) * newData.Stride + (x - MyCompresser.compressKernelSize / 2) * 3; for (int j = 0; j < MyCompresser.compressKernelSize; j++) { for (int i = 0; i < MyCompresser.compressKernelSize; i++) { byte[] result = MyFilterData.boundPixel(srcFilterData[i, j]); //Debug.Print("Data get " + result[0] + " , " + result[1] + " , " + result[2]); dstPtr[0] = result[0]; dstPtr[1] = result[1]; dstPtr[2] = result[2]; dstPtr += 3; } dstPtr += skipByte; } } } } baseImg.UnlockBits(baseData); newImg.UnlockBits(newData); return(newImg); }
public double findMatchTSS(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, ref int targetX, ref int targetY) { // 3 steps searcj matchRatePair dataRecord = new matchRatePair(Double.PositiveInfinity, targetX, targetY); MyFilterData refKernelGet = new MyFilterData(); // the data copy from ref frame of kernel size int x = targetX; int y = targetY; for (int stepLength = refData.Width / 4; stepLength > 0; stepLength /= 2) { //cc compareBlock(search, refData, RefPlayer, x, y, dataRecord); //lt compareBlock(search, refData, RefPlayer, x - stepLength, y - stepLength, dataRecord); //ct compareBlock(search, refData, RefPlayer, x, y - stepLength, dataRecord); //rt compareBlock(search, refData, RefPlayer, x + stepLength, y - stepLength, dataRecord); //lc compareBlock(search, refData, RefPlayer, x - stepLength, y, dataRecord); //rc compareBlock(search, refData, RefPlayer, x + stepLength, y, dataRecord); //ld compareBlock(search, refData, RefPlayer, x - stepLength, y + stepLength, dataRecord); //cd compareBlock(search, refData, RefPlayer, x, y + stepLength, dataRecord); //rd compareBlock(search, refData, RefPlayer, x + stepLength, y + stepLength, dataRecord); x = dataRecord.x; y = dataRecord.y; } targetX = dataRecord.x; targetY = dataRecord.y; return(dataRecord.rate); }
private void compareBlock(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, int x, int y, matchRatePair dataRecord) {// compare the (x , y) similar rate && flash dataRecord & view if (!RefPlayer.flashIgnore) { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(-1, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } MyFilterData refKernelGet = new MyFilterData(); refKernelGet.fill(refData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); double distance = MyFilterData.compare(search, refKernelGet, criteria); if (dataRecord > distance) {// find min distance dataRecord.rate = distance; dataRecord.x = x; dataRecord.y = y; if (!RefPlayer.flashIgnore) { MyDeal.tryDraw(MatchViewer, refKernelGet.transToBitmap()); } } Thread.Sleep(sleepTime); }
public double findMatchNormal(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, ref int targetX, ref int targetY) { // 2D loorer methd if x,y < 0 ? all seach : local primary matchRatePair dataRecord = new matchRatePair(Double.PositiveInfinity, 0, 0); MyFilterData refKernelGet = new MyFilterData(); // the data copy from ref frame of kernel size int farDistance2 = 128; //define half of this is mean the distance value from target is far int nearDistance2 = 32; //define half of this is mean the distance value from target is near int farJumpStap = compressKernelSize; // define search pixel jump step lenth when seach in far area if ((targetX < 0) || (targetY < 0)) {// search all pixels for (int y = 0 + compressKernelSize / 2; y < refData.Height; y += 1) { for (int x = 0 + compressKernelSize / 2; x < refData.Width; x += 1) { if ((!RefPlayer.flashIgnore) && (x % 3 == 0))// reduce the reflash view frequence { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(-1, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } refKernelGet.fill(refData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); double distance = MyFilterData.compare(search, refKernelGet, criteria); if (dataRecord > distance) {// find min distance dataRecord.rate = distance; dataRecord.x = x; dataRecord.y = y; if (!RefPlayer.flashIgnore) { MyDeal.tryDraw(MatchViewer, refKernelGet.transToBitmap()); } } Thread.Sleep(sleepTime); } } targetX = dataRecord.x; targetY = dataRecord.y; return(dataRecord.rate); } else {//local primary // the far area left & top posion int fx = targetX - farDistance2 / 2; int fy = targetY - farDistance2 / 2; // the near area posion int nl = targetX - nearDistance2 / 2; int nt = targetY - nearDistance2 / 2; int nr = targetX + nearDistance2 / 2; int nb = targetY + nearDistance2 / 2; int jumpStap = farJumpStap; for (int y = (fy < (0 + compressKernelSize / 2) ? (0 + compressKernelSize / 2) : fy); (y < refData.Height) && (y < fy + farDistance2); y += jumpStap) { for (int x = (fx < (0 + compressKernelSize / 2) ? (0 + compressKernelSize / 2) : fx); (x < refData.Width) && (x < fx + farDistance2); x += jumpStap) { if ((x >= nl) && (x < nr) && (y >= nt) && (y < nb)) {// in near jumpStap = 1; } else {//in far jumpStap = farJumpStap; } compareBlock(search, refData, RefPlayer, x, y, dataRecord); } } targetX = dataRecord.x; targetY = dataRecord.y; return(dataRecord.rate); } }
public double findMatchLocal(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, ref int targetX, ref int targetY) {// local primary return(findMatchNormal(search, refData, RefPlayer, ref targetX, ref targetY)); }
/// /// -> find Match /// public double findMatchAll(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, ref int targetX, ref int targetY) {// all seach targetX = -1; targetY = -1; return(findMatchNormal(search, refData, RefPlayer, ref targetX, ref targetY)); }
protected void motionMethod() { compressFile.type = MyCompressTiffDefine.TYPE.MOTION; if (RefPlayer != null) { MyFilterData CurKernelGet = new MyFilterData(); // the data copy from cur frame of kernel size for (int i = 0; i < RefPlayer.Tiff.Size; i++) { //run frames //Debug.Print("in frame " + i); trackBar.Invoke(new threadHandler2(progressTrack), i); // reflash progress view RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(i - 1, MyPlayer.PlayState.KEEP)); //flash ref frame view CurPlayer.OnPlay(RefPlayer.NextView, new MyPlayer.PlayEventArgs(0)); //flash current frame view //clear motion view Bitmap motionBlock = null; Bitmap motionVector = null; for (int t = 0; t < 5; t++) { try { motionBlock = new Bitmap(RefPlayer.NextView.Width, RefPlayer.NextView.Height); motionVector = new Bitmap(RefPlayer.NextView.Width, RefPlayer.NextView.Height); } catch (InvalidOperationException) { Thread.Sleep(29); continue; } break; } MyDeal.tryDraw(MotionViewer, motionVector); MyDeal.tryDrawBack(MotionViewer, motionBlock); Graphics graphicMotionBlock = Graphics.FromImage(motionBlock); Graphics graphicMotionVector = Graphics.FromImage(motionVector); int colorLowBound = 64;// for random color value lower bound int colorHighBound = 256 - colorLowBound; Color penColor = Color.Black; if (i == 0) { //uncompress frame number compressFile.baseImg.Add((Image)RefPlayer.Tiff[i].Clone()); // add ref imge compressFile.motionTiff.Add(null); continue; } Bitmap refBitmapCp; // the copy Bitmap for ref frame Bitmap curBitmapCp; // the copy Bitmap for cur frame while (true) { try { refBitmapCp = new Bitmap((Image)RefPlayer.PredictView.Clone());// the copy Bitmap for ref frame } catch (InvalidOperationException) { Thread.Sleep(33); continue; } break; } while (true) { try { curBitmapCp = new Bitmap((Image)RefPlayer.NextView.Clone());// the copy Bitmap for cur frame } catch (InvalidOperationException) { Thread.Sleep(33); continue; } break; } BitmapData refData = refBitmapCp.LockBits(MyDeal.boundB(refBitmapCp), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); BitmapData curData = curBitmapCp.LockBits(MyDeal.boundB(curBitmapCp), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); MyMotionTiff theMotion = new MyMotionTiff(curBitmapCp.Width, curBitmapCp.Height); compressFile.baseImg.Add(null); compressFile.motionTiff.Add(theMotion); for (int y = 0 + compressKernelSize / 2; y < curBitmapCp.Height; y += compressKernelSize) { for (int x = 0 + compressKernelSize / 2; x < curBitmapCp.Width; x += compressKernelSize) { if (activeFrom != null) { if (activeFrom.IsDisposed)//form be dispose { return; } } //draw target if (!CurrentPlayer.flashIgnore) { CurPlayer.OnPlay(RefPlayer.NextView, new MyPlayer.PlayEventArgs(0, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } CurKernelGet.fill(curData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); penColor = Color.FromArgb(colorLowBound + random.Next() % colorHighBound, colorLowBound + random.Next() % colorHighBound, colorLowBound + random.Next() % colorHighBound); if (!this.CurrentPlayer.flashIgnore) { MyDeal.tryDraw(featureViewer, CurKernelGet.transToBitmap()); //draw motion graphicMotionBlock.FillRectangle(new SolidBrush(penColor), x - MyCompresser.compressKernelSize / 4, y - MyCompresser.compressKernelSize / 4, MyCompresser.compressKernelSize / 2, MyCompresser.compressKernelSize / 2); MotionViewer.Invalidate(); } //find match int targetX = x; int targetY = y; findMatch(CurKernelGet, refData, RefPlayer, ref targetX, ref targetY); theMotion[x, y] = new int[] { targetX, targetY }; if (!this.CurrentPlayer.flashIgnore) { //draw match vector graphicMotionVector.DrawLine(new Pen(Color.FromArgb(128, penColor), 2.0f), x, y, targetX, targetY); } //Debug.Print("in frame " + i + " in " + x + " , "+ y + "find target " + targetX + " , " + targetY); } } refBitmapCp.UnlockBits(refData); curBitmapCp.UnlockBits(curData); } if (activeFrom != null) { activeFrom.Invoke(new threadHandler(saveFile));// save the result } } }
protected void blockBaseMethod() { compressFile.type = MyCompressTiffDefine.TYPE.BLOCKBASE; if (RefPlayer != null) { Rectangle cutRect = new Rectangle(0, 0, compressKernelSize, compressKernelSize); MyFilterData CurKernelGet = new MyFilterData();// the data copy from cur frame of kernel MyFilterData RefKernelGet = new MyFilterData(); for (int i = 0; i < RefPlayer.Tiff.Size; i++) { //run frames //Debug.Print("in frame " + i); trackBar.Invoke(new threadHandler2(progressTrack), i); // reflash progress view RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(i - 1, MyPlayer.PlayState.KEEP)); //flash ref frame view CurPlayer.OnPlay(RefPlayer.NextView, new MyPlayer.PlayEventArgs(0)); //flash current frame view //clear motion view Bitmap motionBlock = null; while (true) { try { motionBlock = new Bitmap(RefPlayer.NextView.Width, RefPlayer.NextView.Height); } catch (InvalidOperationException) { Thread.Sleep(29); continue; } break; } MyDeal.tryDrawBack(MotionViewer, motionBlock); Graphics graphicMotionBlock = Graphics.FromImage(motionBlock); Brush redPen = new SolidBrush(Color.Red); if (i == 0) { //uncompress frame number compressFile.baseImg.Add((Image)RefPlayer.Tiff[i].Clone()); // add ref imge compressFile.motionTiff.Add(null); continue; } Bitmap refBitmapCp; // the copy Bitmap for ref frame Bitmap curBitmapCp; // the copy Bitmap for cur frame while (true) { try { refBitmapCp = new Bitmap((Image)RefPlayer.PredictView.Clone());// the copy Bitmap for ref frame } catch (InvalidOperationException) { Thread.Sleep(33); continue; } break; } while (true) { try { curBitmapCp = new Bitmap((Image)RefPlayer.NextView.Clone());// the copy Bitmap for cur frame } catch (InvalidOperationException) { Thread.Sleep(33); continue; } break; } BitmapData refData = refBitmapCp.LockBits(MyDeal.boundB(refBitmapCp), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); BitmapData curData = curBitmapCp.LockBits(MyDeal.boundB(curBitmapCp), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); for (int y = 0 + compressKernelSizeHalf; y < curBitmapCp.Height; y += compressKernelSize) { for (int x = 0 + compressKernelSizeHalf; x < curBitmapCp.Width; x += compressKernelSize) { if (activeFrom != null) { if (activeFrom.IsDisposed)//form be dispose { return; } } //draw target if (!CurrentPlayer.flashIgnore) { CurPlayer.OnPlay(RefPlayer.NextView, new MyPlayer.PlayEventArgs(0, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } if (!RefPlayer.flashIgnore) { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(-1, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } CurKernelGet.fill(curData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); RefKernelGet.fill(refData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); switch (criteria) { case MyFilterData.CRITERIA_METHOD.ABSOLUTE: if (_BBthreshold < MyFilterData.compare(CurKernelGet, RefKernelGet, criteria)) { graphicMotionBlock.DrawImage(CurKernelGet.transToBitmap(), x - compressKernelSizeHalf, y - compressKernelSizeHalf); //graphicMotionBlock.DrawImage(curBitmapCp, cutRect, x - compressKernelSizeHalf, y - compressKernelSizeHalf, compressKernelSize, compressKernelSize, GraphicsUnit.Pixel); } else { graphicMotionBlock.FillRectangle(redPen, x - compressKernelSizeHalf, y - compressKernelSizeHalf, MyCompresser.compressKernelSize, MyCompresser.compressKernelSize); } break; case MyFilterData.CRITERIA_METHOD.SQUARE: if (_BBthresholdSQ < MyFilterData.compare(CurKernelGet, RefKernelGet, criteria)) { graphicMotionBlock.DrawImage(CurKernelGet.transToBitmap(), x - compressKernelSizeHalf, y - compressKernelSizeHalf); //graphicMotionBlock.DrawImage(curBitmapCp, cutRect, x - compressKernelSizeHalf, y - compressKernelSizeHalf, compressKernelSize, compressKernelSize, GraphicsUnit.Pixel); } else { graphicMotionBlock.FillRectangle(redPen, x - compressKernelSizeHalf, y - compressKernelSizeHalf, MyCompresser.compressKernelSize, MyCompresser.compressKernelSize); } break; } if (!this.RefPlayer.flashIgnore) { MyDeal.tryDraw(MatchViewer, RefKernelGet.transToBitmap()); } if (!this.CurrentPlayer.flashIgnore) { MyDeal.tryDraw(featureViewer, CurKernelGet.transToBitmap()); //draw motion MotionViewer.Invalidate(); } Thread.Sleep(sleepTime); //Debug.Print("in frame " + i + " in " + x + " , "+ y + "find target " + targetX + " , " + targetY); } } compressFile.baseImg.Add(motionBlock);// add ref imge compressFile.motionTiff.Add(null); refBitmapCp.UnlockBits(refData); curBitmapCp.UnlockBits(curData); } if (activeFrom != null) { activeFrom.Invoke(new threadHandler(saveFile));// save the result } } }
protected void intraSubsample() { compressFile.type = MyCompressTiffDefine.TYPE.SUBSAMPLE; if (RefPlayer != null) { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(0, MyPlayer.PlayState.KEEP)); CurPlayer.Tiff = RefPlayer.Tiff.clone(); MyFilterData CurKernelGet = new MyFilterData();// the data copy from cur frame of kernel size int intraSubSize = 2; int subSizeHalf = intraSubSize / 2; double subWeight = 1.0 / (intraSubSize * intraSubSize); MyFilter intraSubFilter = new MyFilter(intraSubSize); intraSubFilter.setData(1.0); for (int i = 0; i < RefPlayer.Tiff.Size; i++) { //run frames //Debug.Print("in frame " + i); trackBar.Invoke(new threadHandler2(progressTrack), i); // reflash progress view CurPlayer.OnPlay(new MyPlayer.PlayEventArgs(i)); //flash current frame view Bitmap curBitmapCp; // the copy Bitmap for cur frame Bitmap dstBitmap; // viewer in counting out view while (true) { try { curBitmapCp = new Bitmap((Image)CurPlayer.PredictView.Clone());// the copy Bitmap for cur frame } catch (InvalidOperationException) { Thread.Sleep(33); continue; } break; } dstBitmap = new Bitmap(curBitmapCp.Width, curBitmapCp.Height); while (true) { try { MotionViewer.Image = dstBitmap; } catch (InvalidOperationException) { Thread.Sleep(33); continue; } break; } BitmapData curData = curBitmapCp.LockBits(MyDeal.boundB(curBitmapCp), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); //Bitmap afterSubView = new Bitmap(intraSubSize, intraSubSize);// view in match blok //while (true) //{ // try // { // MatchViewer.Image = afterSubView; // } // catch (InvalidOperationException) // { // Thread.Sleep(33); // continue; // } // break; //} //Graphics afterSubViewG = Graphics.FromImage(afterSubView); Graphics dstBitmapG = Graphics.FromImage(dstBitmap); int freq = 0; for (int y = 0 + subSizeHalf; y < curBitmapCp.Height; y += intraSubSize) { for (int x = 0 + subSizeHalf; x < curBitmapCp.Width; x += intraSubSize) { if (activeFrom != null) { if (activeFrom.IsDisposed)//form be dispose { return; } } //draw target if (!this.CurrentPlayer.flashIgnore) { if (freq % 2 == 0) { // reduce flash freq freq = 0; CurPlayer.OnPlay(new MyPlayer.PlayEventArgs(-1, MyPlayer.PlayState.KEEP, x, y, intraSubSize, intraSubSize)); } else { freq++; } } CurKernelGet.fill(curData, x, y, MyFilter.BorderMethod.ZERO, intraSubFilter); //MyDeal.tryDraw(featureViewer, CurKernelGet.transToBitmap()); byte[] subSample = CurKernelGet.count(subWeight); //Debug.Print("in " + x + " , " + y + " : " + subSample[2] + " " + subSample[1] + " " + subSample[0]); Color sampleColor = Color.FromArgb(subSample[2], subSample[1], subSample[0]); Brush sample = new SolidBrush(sampleColor); dstBitmapG.FillRectangle(sample, x - subSizeHalf, y - subSizeHalf, intraSubSize, intraSubSize); if (!this.CurrentPlayer.flashIgnore) { MotionViewer.Invalidate(); } //MatchViewer.Invalidate(); Thread.Sleep(sleepTime); //Debug.Print("in frame " + i + " in " + x + " , "+ y + "find target " + targetX + " , " + targetY); } } curBitmapCp.UnlockBits(curData); compressFile.baseImg.Add(dstBitmap);// add dst imge compressFile.motionTiff.Add(null); } if (activeFrom != null) { activeFrom.Invoke(new threadHandler(saveFile));// save the result } } }