7390|20

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

图片旋转 [复制链接]

怎样在不开辟一个新的内存空间的情况下实现bmp图片的旋转

最新回复

你在检查一下代码,肯定不会错的,因为验证过的。   详情 回复 发表于 2007-8-21 19:06
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
什么意思?
不明白
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
就是说我通过代码显示出了一张图片,然后想实现图片的旋转功能.
我刚开始是这样做的:
  先开辟一个空间,然后用该空间来存储旋转后图片的每一个点的信息.最后把图片显示出来
但是这个样子做就是要占用内存,比如说一个图片已经显示出来了,然后我让它旋转,那它还要重新去开辟一个空间,而假如此时内存不够时,那它就旋转不了了.
  我现在想问的就是一张图片已经显示出来了,我在不重新开辟内存空间的情况下怎样实现图片的旋转啊?

  希望有人能够给我解答解答哈!
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
你要不想使用内存,那就在存储介质(FLASH,SD CARD)上面使用临时文件来做了。当然,这需要一定的条件。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
直接操作显示缓冲区,
写一个算法,一次交换一个像素,
直至整幅图片,

这样占用内存很小,
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
rzsheng(跑生活的男人)

但是这样子你要定义一个很大的数组啊,这样子占用内存也很大啊
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
还有个方法,前提是你的板子够快,什么内存空间都不要了,直接读取图片信息,然后显示出来,一次读一行好了,最多几百个字节的存储空间,这总行的吧。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
忘了说,这个方法DOS下可以,可以直接获得显存地址,但是wince下是保护模式,还没试过,不过你的显示驱动一定要支持。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

9
 
yashi(老斩)
我试过在SD卡上存储信息,然后读取,但是这种方法实在是太慢了
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

10
 
dthxman()

这个假如是直接显示一张原始图片,可以做到,但是要旋转,每一个象素点的位置都变化了.这个方法好像不行吧
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

11
 
不知这个问题解决没有哈
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
我也遇到了这个问题,期望有人来解决一下
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 
矩阵变换就行了
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

14
 
huangtaoyuan(无所不能):我知道是矩阵变换...
但我从CreateDIBSection 得出的指向位图位置的指针的指针
这是个指针,类似一维数组,还得转化成矩阵...
然后变换,再赋过来...
不知你是怎么做的,这样太麻烦了呵
多谢
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
那准备每个方向的图片各一张,最方便了。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

16
 
首先取得图片各像素点的rgb,然后做矩阵变换呀。比如:
typedef struct _MYRGB
        {
                BYTE r;
                BYTE g;
                BYTE b;
        }MyRGB;
BYTE  *lpBitmapBits = NULL;
MyRGB* pDes = (MyRGB*)malloc(width * height * 3 + 1);//
memset(pDes,0,width * height * 3 + 1);
MyRGB* pSrc = (MyRGB* )lpBitmapBits;//
HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
                DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
比如逆时针90°,变换如下:
for(int l = 0;l < width * height;l++)
{
        int i = l/width;
        int j = l%width;
        pDes[j * height + height - 1 - i] = pSrc[i * width + j];
}
然后在:
StretchDIBits(hScrDC,0,0,height,width,0,0,height,width,
                        pDes,&RGB24BitsBITMAPINFO,DIB_RGB_COLORS,SRCCOPY);
就行了啊。速度挺快的。我就是这样解决的。也许还有别的好方法。在这里共享一下啊。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 
我再试一下
对了问你

hScrDC 是怎么赋值的,
我是这样的 HDC hdc = ::GetDC(m_PictureWindow.m_hWnd);
应该也是可以的吧
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

18
 
我就这样做的,但还是没显示出来哈..
huangtaoyuan能帮忙看一下么       

         int width=image.GetWidth();
        int height=image.GetHeight();
        HDC hScrDC = ::GetDC(m_PictureWindow.m_hWnd);
        HDC hMemDC = CreateCompatibleDC(hScrDC);
        BYTE  *lpBitmapBits = NULL;
        MyRGB* pDes = (MyRGB*)malloc(width * height * 3 + 1);//
        memset(pDes,0,width * height * 3 + 1);
        MyRGB* pSrc = (MyRGB* )lpBitmapBits;//

        BITMAPINFO RGB24BitsBITMAPINFO;
        ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
        RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
        RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
        RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
        RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
        HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
        DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
       
        //比如逆时针90°,变换如下:
        for(int l = 0;l < width * height;l++)
        {
        int i = l/width;
        int j = l%width;
        pDes[j * height + height - 1 - i] = pSrc[i * width + j];
        }
        //然后在:
        StretchDIBits(hScrDC,0,0,height,width,0,0,height,width,
        pDes,&RGB24BitsBITMAPINFO,DIB_RGB_COLORS,SRCCOPY);
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
hScrDC = ::GetDC(hwnd);
hwnd是static控件的句柄,我图片是显示在static上的
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

20
 
pDes[j * height + height - 1 - i] = pSrc[i * width + j];
这句跟踪的时候,提示数组溢出....
方便不方便留一下QQ或是其他聊天工具,多谢了呵
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表