首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Windows Mobile >> Windows Mobile 入门 >> 正文
PPC图片旋转功能
作者:编程菜菜…    文章来源:博客园    更新时间:2007-10-28 8:50:27
    我是一个剧懒的人,算算看最近一次上博客已经是去年的事了。唉,没办法,谁叫咱天生就懒呢。

    最近碰到一个要控制摄像头的代码,因为图片旋转的事,着实忙乎了我一阵子,网上看了无数代码,就是没有能在PPC上用的,没办法,只好自己动手重新写了个,今天贴出来,大家看看,有更好的改进意见,大家交流。

using System;
using System.Collections.Generic;
using System.Text;

namespace Jrong
{
    public class Drawing
    {
        /// <summary>
        /// 指定图像的旋转方向和用于翻转图像的轴。(自定义,较系统自带弱)
        /// </summary>
        public enum RotateType
        {
            /// <summary>
            /// 90 度旋转。
            /// </summary>
            Rotate90 = 1,
            /// <summary>
            /// 180 度旋转。
            /// </summary>
            Rotate180 = 2,
            /// <summary>
            /// 270 度旋转。
            /// </summary>
            Rotate270 = 4
        }

        #region 旋转图片,直接内存操作,会只动释放输入图片

        /// <summary>
        /// 旋转图片,直接内存操作,会自动释放输入图片(为节省内存)
        /// </summary>
        /// <param name="pBitmap">输入图片,计算完成后会直接 Dispose()(为节省内存)</param>
        /// <param name="pRotateType">90、180 或是 270 度</param>
        /// <returns></returns>
        public static System.Drawing.Bitmap RotateBitmap(System.Drawing.Bitmap pBitmap, RotateType pRotateType)
        {
            System.Drawing.Bitmap imgOut;

            switch (pRotateType)
            {
                case RotateType.Rotate90:
                case RotateType.Rotate270:
                    imgOut = new System.Drawing.Bitmap(pBitmap.Height, pBitmap.Width, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    break;

                case RotateType.Rotate180:
                    imgOut = new System.Drawing.Bitmap(pBitmap.Width, pBitmap.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    break;

                default: return pBitmap;
            }

            System.Drawing.Imaging.BitmapData dataIn = pBitmap.LockBits(new System.Drawing.Rectangle(0, 0, pBitmap.Width, pBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            System.Drawing.Imaging.BitmapData dataOut = imgOut.LockBits(new System.Drawing.Rectangle(0, 0, imgOut.Width, imgOut.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            unsafe
            {
                byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
                byte* pOut = (byte*)(dataOut.Scan0.ToPointer());

                switch (pRotateType)
                {
                    case RotateType.Rotate90:

                        pOut += dataOut.Stride * (dataOut.Height - 1); // 定义到初始位置

                        for (int y = 0; y < dataIn.Height; y++)
                        {
                            for (int x = 0; x < dataIn.Width; x++)
                            {
                                pOut[0] = (byte)pIn[0];
                                pOut[1] = (byte)pIn[1];
                                pOut[2] = (byte)pIn[2];

                                pIn += 3;
                                pOut -= dataOut.Stride;   // 最后一次无效,多减了一次
                            }
                            pIn += dataIn.Stride - dataIn.Width * 3;
                            pOut += dataOut.Stride * dataOut.Height + 3; // 因为上面多 减 了一次,所以这里要加回来
                        }
                        break;

                    case RotateType.Rotate180:

                        pOut += dataOut.Stride * dataOut.Height - 3; // 定义到初始位置

                        for (int y = 0; y < dataIn.Height; y++)
                        {
                            for (int x = 0; x < dataIn.Width; x++)
                            {
                                pOut[0] = (byte)pIn[0];
                                pOut[1] = (byte)pIn[1];
                                pOut[2] = (byte)pIn[2];

                                pIn += 3;
                                pOut -= 3;
                            }
                            pIn += dataIn.Stride - dataIn.Width * 3;
                            pOut -= dataOut.Stride - dataOut.Width * 3;
                        }
                        break;

                    case RotateType.Rotate270:

                        pOut += 3 * (dataOut.Width - 1); // 定义到初始位置

                        for (int y = 0; y < dataIn.Height; y++)
                        {
                            for (int x = 0; x < dataIn.Width; x++)
                            {
                                pOut[0] = (byte)pIn[0];
                                pOut[1] = (byte)pIn[1];
                                pOut[2] = (byte)pIn[2];

                                pIn += 3;
                                pOut += dataOut.Stride;   // 最后一次无效,多加了一次
                            }
                            pIn += dataIn.Stride - dataIn.Width * 3;
                            pOut -= dataOut.Stride * dataOut.Height + 3;// 因为上面多 加 了一次,所以这里要 减 回来  -(-3) = +3
                        }
                        break;
                }
            }

            imgOut.UnlockBits(dataOut);
            pBitmap.UnlockBits(dataIn);

            pBitmap.Dispose(); // 卸载输入图片资源,为了防止出现 System.OutOfMemoryException 错误
            pBitmap = null;

            return imgOut;
        }

        #endregion
    }
}

相关文章:
没有相关文章
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号