그림 이 수평 과 수직 방향 으로 뒤 집 히 는 것 을 실현 합 니 다 (180 도 회전)
왼쪽으로 날 아 가 는 이미지 처리 서 를 찾 아 보고 GDI + 에서 DrawImage 를 기반 으로 반전 을 실현 하 는 방법 을 소개 했다. 해상도 2592 * 1944 의 그림 은 260 ms 가 걸 리 고 너무 느 려 서 이런 방법 은 바람 직 하지 않다.실현 코드 는 다음 과 같다.
private Bitmap ReverseByDrawImage(Bitmap bitmap)
{
System.DateTime begin = System.DateTime.Now;
Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
using (Graphics graphics = Graphics.FromImage(image)) // FromImage(bitmap), “ Graphics 。”
{
Rectangle Rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
graphics.DrawImage(bitmap, Rect, Rect, GraphicsUnit.Pixel);
graphics.Dispose();
}
Graphics graphicsRev = Graphics.FromImage(image);
Point[] VerPoints = { new Point(bitmap.Width, 0), new Point(0, 0), new Point(bitmap.Width, bitmap.Height) };
graphicsRev.DrawImage(image, VerPoints);
Point[] HorPoints = { new Point(0, bitmap.Height), new Point(bitmap.Width, bitmap.Height), new Point(0, 0) };
graphicsRev.DrawImage(image, HorPoints);
System.DateTime end = System.DateTime.Now;
TimeSpan duration = end - begin;
MessageBox.Show("DrawImage Duration time is :" + duration.Milliseconds + " ms");
return image;
}
두 번 째 방법 은 메모리 에서 반전 을 실현 하 는 것 입 니 다. 원 리 는 메모리 에서 그림 픽 셀 의 앞 뒤 를 바 꾸 는 것 입 니 다. 이 방법 은 26ms 가 걸 리 고 코드 는 다음 과 같 습 니 다.
private unsafe Bitmap ReverseBmpByPtr(Bitmap bitmap)
{
System.DateTime begin = System.DateTime.Now;
Bitmap bitmapClone = (Bitmap)bitmap.Clone();
int width = bitmap.Width;
int height = bitmap.Height;
int length = height * width;
byte[] Pixels = new byte[length];
byte[] PixelsClone = new byte[length];
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
BitmapData dataClone = bitmapClone.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
System.IntPtr Scan0 = data.Scan0;
System.IntPtr Scan0Clone = dataClone.Scan0;
System.Runtime.InteropServices.Marshal.Copy(Scan0, Pixels, 0, length);
System.Runtime.InteropServices.Marshal.Copy(Scan0Clone, PixelsClone, 0,length);
for (int i = 0; i < Pixels.Length; i += 1)
{
PixelsClone[i] = Pixels[length-i-1];
}
System.Runtime.InteropServices.Marshal.Copy(Pixels, 0, Scan0, length);
System.Runtime.InteropServices.Marshal.Copy(PixelsClone, 0, Scan0Clone, length);
bitmap.UnlockBits(data);
bitmapClone.UnlockBits(dataClone);
System.DateTime end = System.DateTime.Now;
TimeSpan duration = end - begin;
MessageBox.Show("Ptr Duration time is :" + duration.Milliseconds + " ms");
return bitmapClone;
}
나중에 Bitmap 류 는 그림 과 회전, 뒤 집기 동작 을 지원 하 는 방법 이 있 습 니 다. 속도 가 빠 르 고 15ms 가 걸 립 니 다.
private Bitmap ReverseBmpByRotateFlip(Bitmap bitmap)
{
System.DateTime begin = System.DateTime.Now;
bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
System.DateTime end = System.DateTime.Now;
TimeSpan duration = end - begin;
MessageBox.Show("RotateFlip Duration time is :" + duration.Milliseconds + " ms");
return bitmap;
}
Halcon 에서 mirror 테스트 했 습 니 다.image 연산 자, 소요 시간 은 약 13ms 입 니 다.
픽 셀 기반 이미지 처 리 는 메모리 에 넣 어야 합 니 다. 그렇지 않 으 면 너무 느 려 서 GetPixel 과 SetPixel 같은 방법 을 사용 하지 마 십시오.