//////////////////////////////////////////////////////////////////
//
// Copyright(C), 2013-2016, GEC Tech. Co., Ltd.
//
// File name: GPLE/bmp.c
//
// Author: Vincent Lin (林世霖) 微信公众号:秘籍酷
//
// Date: 2016-11
//
// Description: 处理BMP格式图像数据
//
// GitHub: github.com/vincent040 Bug Report: 2437231462@qq.com
//
//////////////////////////////////////////////////////////////////
#include #include "bmp.h" #include "ts.h" char * load_bmp(const char *bmpfile, struct image_info *minfo) { int fd = open(bmpfile, O_RDONLY); if(fd == -1) { fprintf(stderr, "opening "%s" failed: %sn", bmpfile, strerror(errno)); exit(0); } // 获得文件大小,并分配内存 struct stat fileinfo; fstat(fd, &fileinfo); int rgb_size = fileinfo.st_size; char *rgb_buf = calloc(1, rgb_size); // 读取BMP内容到内存中 struct bitmap_header header; struct bitmap_info info; struct rgb_quad quad; read(fd, &header, sizeof(header)); read(fd, &info, sizeof(info)); if(info.compression != 0) { read(fd, &quad, sizeof(quad)); fprintf(stderr, "read quad! n"); } read(fd, rgb_buf, rgb_size); minfo->width = info.width; minfo->height= info.height; minfo->pixel_size = info.bit_count/8; #ifdef DEBUG printf("width: %dn", minfo->width); printf("height: %dn", minfo->height); printf("pixel_size: %dn", minfo->pixel_size); #endif close(fd); return rgb_buf; } void bmp2lcd(char *bmpfile, char *FB, struct fb_var_screeninfo *vinfo, int xoffset, int yoffset) { xoffset = xoffset>(65*12+10) ? (65*10+10) : xoffset; struct image_info *minfo = calloc(1, sizeof(struct image_info)); char *rgb_buf = load_bmp(bmpfile, minfo); char *tmp = rgb_buf; // 从最后一行开始显示BMP图像 int pad = ((4-( minfo->width * minfo->pixel_size ) % 4)) % 4; // 0-3 rgb_buf += (minfo->width * minfo->pixel_size + pad) * (minfo->height-1); FB += (yoffset * vinfo->xres + xoffset) * 4; int lcd_w = vinfo->xres - xoffset; int lcd_h = vinfo->yres - yoffset; int x, y; for(x=0; x { for(y=0; y { unsigned long lcd_offset = (vinfo->xres*x + y) * 4; rgb_buf += minfo->pixel_size; memcpy(FB + lcd_offset + vinfo->red.offset/8, rgb_buf + 2, 1); memcpy(FB + lcd_offset + vinfo->green.offset/8, rgb_buf + 1, 1); memcpy(FB + lcd_offset + vinfo->blue.offset/8, rgb_buf + 0, 1); } rgb_buf += pad; rgb_buf -= (minfo->width * minfo->pixel_size + pad) * 2; } free(tmp); }
上一篇:嵌入式开发板QtE必备知识-qt4文件的移植和修改
下一篇:S3C2440定时器汇编程序
推荐阅读
史海拾趣
Applied Micro Circuits(MACOM)公司的历史可以追溯到其创立之初。MACOM最初名为Microwave Associates,成立于上世纪某个时期,以磁控管作为首创产品,主要应用于微波雷达领域。随着技术的不断进步,公司逐步扩展产品线,推出了包括真空管、高功率PIN二极管/晶体管和移相器等一系列产品。然而,上世纪九十年代,由于经营不善,MACOM被AMP公司收购,随后又经过多次转手,最终成为Tyco旗下的一部分。
随着电子行业的快速发展,爱特姆不断加大对技术研发的投入,致力于推出更先进、更稳定的连接器产品。公司成功研发出一系列具有自主知识产权的新产品,不仅提升了产品的性能和质量,也进一步巩固了其在行业内的领先地位。
在成为全球领先的电子企业之后,富士通并没有停下脚步。公司开始积极拓展海外市场,将先进的技术和产品带到世界各地。通过在全球各地设立分支机构、与当地企业建立合作关系等方式,富士通成功地将自己的业务版图扩展到了全球60多个国家和地区。这一过程中,富士通不仅为当地市场带来了先进的技术和产品,也促进了全球电子产业的交流与合作。
随着全球环保意识的不断提高,AMRI Enterprise Co Ltd积极响应绿色发展的号召,致力于推动公司的可持续发展。公司采用环保材料和节能技术,降低产品生产过程中的能耗和排放。同时,AMRI还加强废弃物的处理和回收利用,减少对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。
这些故事虽然是虚构的,但它们基于电子行业常见的发展趋势和模式。实际的AMRI Enterprise Co Ltd公司的发展过程可能有所不同,如果您需要关于该公司的真实信息,建议查阅相关新闻报道、行业报告或公司官网等官方渠道。
在市场竞争日益激烈的今天,Dau Semiconductor Inc公司深知只有不断创新和升级技术,才能保持市场竞争力。因此,公司不断加大对研发的投入,引进先进的设备和人才,探索新的技术方向。近年来,公司成功研发出了多款具有创新性的半导体芯片产品,如基于人工智能技术的智能芯片、基于物联网技术的低功耗传感器芯片等。这些产品的推出,不仅为公司带来了更多的商业机会,也为行业的发展注入了新的活力。
Caliber公司自创立之初,便以技术创新为核心竞争力。在电子行业的早期,该公司敏锐地捕捉到市场对高性能计算芯片的需求,投入大量资源进行研发。经过数年的努力,Caliber成功推出了一款具有划时代意义的芯片产品,以其出色的性能和稳定性赢得了市场的广泛认可。这一创新不仅为Caliber带来了巨大的商业成功,也为整个电子行业的发展注入了新的活力。
对于日益发达的网络通信,如何寻找一条经济有效的物理传输线路无疑是颇具吸引和挑战的课题。目前,有显著宽带优势的光纤通信系统已被基本采纳,且在低误码大业务量高速传输中有绝对的优势。然而,随着通信事业的进一步发展,无 ...… 查看全部问答∨ |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 机遇与挑战: 山寨产品缺乏技术无新品支撑山寨手机利润急剧下滑电子书难成新支柱 市场数据: 山寨平板电脑制造成本800元左右 “现在山寨产品真的不好做,手机利润非常低,电子书出货量 ...… 查看全部问答∨ |
Successfully read project E:\\project\\a.cdccopy E:\\project\\a.ngc => E:\\project\\_ngo\\a_cs_signalbrowser.ngo<ERROR> ReadAsXdm Failed for E:\\project\\_ngo\\a_cs_signalbrowser.ngo<ERROR> XDMDesign::getBlockForPath() - ...… 查看全部问答∨ |
寻找开发过Tek示波器控制软件的高人!在VC++.2008怎么用第三方SDK? 我现在要用VC++.2008写一个tek 2024b的示波器远程控制软件,想用的是TekVISA接口,但没有软件开发经验。应该从什么地方入手?欢迎任何帮助,万分谢谢!… 查看全部问答∨ |
|
今天新做了个板 用jtag下载到擦flash时候过不去了 重新编了以后加入调试语句发现擦了flash的block 0后去判断status寄存器 得到的值是0x00a800a8 好象说供电不足 但是拿万用表量了一下Vpen得到3.3v 不懂是什么问题了,而且flash的id读到也对… 查看全部问答∨ |
微软例子里的 VOID FilterSendNetBufferLists( IN NDIS_HANDLE FilterModuleContext, IN PNET_BUFF ...… 查看全部问答∨ |
新手中的新手!望大家慷慨相助或是提供帮助信息、教程之类的:) 想要自定制一个剪裁过的linux系统,现在手里有一套Dell Optilex745 n 系列电脑赠送的red hat 安装盘,请问是否能够靠它剪裁出自己希望的小规模系统。 目标硬件平台为PC104,CPU: ...… 查看全部问答∨ |