翻转或旋转.docx
- 文档编号:9498227
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:249.22KB
翻转或旋转.docx
《翻转或旋转.docx》由会员分享,可在线阅读,更多相关《翻转或旋转.docx(21页珍藏版)》请在冰豆网上搜索。
翻转或旋转
Bitmap类里的方法RotateFlip能把位图进行翻转或旋转,对其实现方式很好奇。
下面就是实现的功能:
1.计算目标图像每像素的位置所用的接口
[c-sharp]viewplaincopyprint?
1.using System;
2.namespace Colorall
3.{
4. public interface IRotateFlipDestination
5. {
6. int CalculatePos(int x, int y, int byteCountPercentPixel);
7. int Height { get; set; }
8. int Stride { get; set; }
9. int Width { get; set; }
10. }
11.}
2.计算目标图像每像素的位置所用的抽象类(其实接口可以省略)
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. public abstract class RotateFlipDestinationBase :
IRotateFlipDestination
8. {
9. private int _width;
10.
11. public int Width
12. {
13. get { return _width; }
14. set { _width = value; }
15. }
16. private int _height;
17.
18. public int Height
19. {
20. get { return _height; }
21. set { _height = value; }
22. }
23. private int _stride;
24.
25. public int Stride
26. {
27. get { return _stride; }
28. set { _stride = value; }
29. }
30.
31. public abstract int CalculatePos(int x, int y, int byteCountPercentPixel);
32. }
33.}
3.旋转180°所用到的计算
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class Rotate180FlipNone :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return (Height - y - 1) * Stride + (Width - x - 1) * byteCountPercentPixel;
12. }
13. }
14.}
4.旋转180°再垂直翻转
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class Rotate180FlipY :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return y * Stride + (Width - x - 1) * byteCountPercentPixel;
12. }
13. }
14.}
5.旋转180°
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class Rotate270FlipNone :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return (Height - x - 1) * Stride + y * byteCountPercentPixel;
12. }
13. }
14.}
6.旋转90°
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class Rotate90FlipNone :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return x * Stride + (Width - y - 1) * byteCountPercentPixel;
12. }
13. }
14.}
7.旋转90°再水平翻转
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class Rotate90FlipX :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return x * Stride + y * byteCountPercentPixel;
12. }
13. }
14.}
8.旋转90°再垂直翻转
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class Rotate90FlipY :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return (Height - x - 1) * Stride + (Width - y - 1) * byteCountPercentPixel;
12. }
13. }
14.}
9.不进行旋转和翻转
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class RotateNoneFlipNone :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return y * Stride + x * byteCountPercentPixel;
12. }
13. }
14.}
10.垂直翻转
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.
5.namespace Colorall
6.{
7. class RotateNoneFlipY :
RotateFlipDestinationBase
8. {
9. public override int CalculatePos(int x, int y, int byteCountPercentPixel)
10. {
11. return (Height - y - 1) * Stride + x * byteCountPercentPixel;
12. }
13. }
14.}
11.静态旋转翻转类
[c-sharp]viewplaincopyprint?
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.using System.Drawing;
5.using System.Drawing.Imaging;
6.
7.namespace Colorall
8.{
9. class MyBitmap
10. {
11. public static Bitmap RotateFlip(Bitmap originalBitmap, RotateFlipType rotateFlipType)
12. {
13. int byteCountsPercentPixel = GetByteCountsPercentPixel(originalBitmap.PixelFormat);
14.
15. System.Drawing.Rectangle originalBitmapRect = new System.Drawing.Rectangle(0, 0, originalBitmap.Width, originalBitmap.Height);
16. BitmapData originalBitmapData = originalBitmap.LockBits(originalBitmapRect, ImageLockMode.ReadWrite, originalBitmap.PixelFormat);
17. IntPtr originalBitmapPtr = originalBitmapData.Scan0;
18. int originalBitmapBytes = originalBitmapData.Stride * originalBitmap.Height;
19. byte[] originalBitmapRgbValues = new byte[originalBitmapBytes];
20.
21. IRotateFlipDestination rotateFlipDestination = CreatRotateFlipDestination(originalBitmap, rotateFlipType);
22.
23. Bitmap destinationBitmap = new Bitmap(rotateFlipDestination.Width, rotateFlipDestination.Height, originalBitmap.PixelFormat);
24.
25. System.Drawing.Rectangle destinationBitmapRect = new System.Drawing.Rectangle(0, 0, destinationBitmap.Width, destinationBitmap.Height);
26. BitmapData destinationBitmapData = destinationBitmap.LockBits(destinationBitmapRect, ImageLockMode.ReadWrite, originalBitmap.PixelFormat);
27. IntPtr destinationBitmapPtr = destinationBitmapData.Scan0;
28. int destinationBitmapBytes = destinationBitmapData.Stride * destinationBitmap.Height;
29. byte[] destinationBitmapRgbValues = new byte[destinationBitmapBytes];
30.
31. rotateFlipDestination.Stride = destinationBitmapData.Stride;
32.
33. System.Runtime.InteropServices.Marshal.Copy(originalBitmapPtr, originalBitmapRgbValues, 0, originalBitmapBytes);
34. System.Runtime.InteropServices.Marshal.Copy(destinationBitmapPtr, destinationBitmapRgbValues, 0, destinationBitmapBytes);
35.
36. int originalBitmapPos = 0;
37. int destinationBitmapPos = 0;
38.
39. for (int y = 0; y < originalBitmapData.Height; y++)
40. {
41. for (int x = 0; x < originalBitmapData.Width; x++)
42. {
43. originalBitmapPos = y * originalBitmapData.Stride + x * byteCountsPercentPixel;
44. destinationBitmapPos = rotateFlipDestination.CalculatePos(x, y, byteCountsPercentPixel);
45. for (int i = 0; i < byteCountsPercentPixel; i++)
46. {
47. destinationBitmapRgbValues[destinationBitmapPos + i] = originalBitmapRgbValues[originalBitmapPos + i];
48. }
49. }
50. }
51.
52. System.Runtime.InteropServices.Marshal.Copy(destinationBitmapRgbValues, 0, destinationBitmapPtr, destinationBitmapBytes);
53. destinationBitmap.UnlockBits(destinationBitmapData);
54. originalBitmap.UnlockBits(originalBitmapData);
55.
56. return destinationBitmap;
57. }
58.
59. private static IRotateFlipDestination CreatRotateFlipDestination(Bitmap originalBitmap, RotateFlipType rotateFlipType)
60. {
61. IRotateFlipDestination rotateFlipDestination = null;
62. switch (rotateFlipType)
63. {
64. case RotateFlipType.RotateNoneFlipNone:
65. //case RotateFlipType.Rotate180FlipXY:
66. rotateFlipDestination = new RotateNoneFlipNone();
67. rotateFlipDestination.Width = originalBitmap.Width;
68. rotateFlipDestination.Height = originalBitmap.Height;
69. break;
70. case RotateFlipType.Rotate180FlipNone:
71. //case RotateFlipType.RotateNoneFlipXY:
72. rotateFlipDestination = new Rotate180FlipNone();
73. rotateFlipDestination.Width = originalBitmap.Width;
74. rotateFlipDestination.Height = originalBitmap.Height;
75. break;
76. case RotateFlipType.Rotate180FlipY:
77. //case RotateFlipType.RotateNoneFlipX:
78. rotateFlipDestination = new Ro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 翻转 旋转