public Bitmap PerspectiveTransform8bit(Bitmap srcImage, PointF2D[,] points, PerspectiveTransType type) { Bitmap purImage = new Bitmap(srcImage.Width, srcImage.Height, PixelFormat.Format8bppIndexed); Rectangle size = new Rectangle(0, 0, srcImage.Width, srcImage.Height); BitmapData srcData = srcImage.LockBits(size, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); BitmapData purData = purImage.LockBits(size, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed); unsafe { float[] linkPoints = new float[50]; for (int row = 0; row < 5; row++) { for (int col = 0; col < 10; col += 2) { int fixIndex = row * 10 + col; linkPoints[fixIndex] = points[row, (col >> 1)].X == srcImage.Width + 10 ? points[row, (col >> 1)].X - 11 : points[row, (col >> 1)].X - 10; linkPoints[fixIndex + 1] = points[row, (col >> 1)].Y == srcImage.Height + 10 ? points[row, (col >> 1)].Y - 11 : points[row, (col >> 1)].Y - 10; } } IntPtr srcPtr = srcData.Scan0; IntPtr purPtr = purData.Scan0; ivcPerspectiveTransform8bit(srcPtr, purPtr , srcImage.Width, srcImage.Height , linkPoints , (int)type); } purImage.Palette = _colorPalette; srcImage.UnlockBits(srcData); purImage.UnlockBits(purData); return(purImage); }
private void checkBox2_CheckedChanged(object sender, EventArgs e) { string type = ((CheckBox)sender).Text; if (type == "鄰近" && ((CheckBox)sender).Checked) { _transType = PerspectiveTransType.TRANS_NEAREST; checkBox3.Checked = false; checkBox4.Checked = false; } else if (type == "雙線" && ((CheckBox)sender).Checked) { _transType = PerspectiveTransType.TRANS_LINEAR; checkBox2.Checked = false; checkBox3.Checked = false; } else if (((CheckBox)sender).Checked) { _transType = PerspectiveTransType.TRANS_BICUBIC; checkBox2.Checked = false; checkBox4.Checked = false; } }