继前面的文章,本文是一个测试例子,并给出测试结果。

将图片转换成目标文件命令与x86平台相类似,只需修改几个参数即可。
命令如下:

$ arm-linux-objcopy -I binary -O elf32-littlearm -B arm logo.jpg logo.o

需要注意的是输出文件的格式,即-O选项的内容,这里是elf32-littlearm,原来是写elf32-little,但转换得到的目标文件没有机器类型,即便用-B arm指定也不行。
下面是完整的源文件:

/****************************************************************
 
 $ arm-linux-objcopy -I binary -O elf32-littlearm -B arm logo.jpg logo.o
 
 $ arm-linux-gcc jpeg_test.c fb_utils.c -o jpeg_test -I/your/jpeg/.h
   -L/your/jpeg/lib -ljpeg
 $ arm-linux-gcc jpeg_test.c fb_utils.c logo.o 
   -I/home/latelee/my2440/lib_pic/include -L/home/latelee/my2440/lib_pic/lib 
   -ljpeg -o jpeg_test
*****************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jpeglib.h>
#include <jerror.h>

#include "fb_utils.h"

static int fb_width;
static int fb_height;
static int fb_depth;
static unsigned char *fb_mem;

// test of pic
extern _binary_logo_jpg_start;
extern _binary_logo_jpg_end;
extern _binary_logo_jpg_size;

/**
 * jpeg_init - init jpeg width height, etc.
 *
 * note: 
 * Must call fb_init() before this function.
 */
int jpeg_init(void)
{
        if (fb) {
                fb_width  = fb->width;
                fb_height = fb->height;
                fb_depth  = fb->bytes_per_pixel*8;
                fb_mem    = fb->fbmem;
                return 0;
        } else {
                // printf("init fb first\n");
                return -1;
        }
}
/**
 * draw_jpeg - Display a jpeg picture from (0, 0) on framebuffer
 * @name: picture name(foo.jpg)
 */
int draw_jpeg()
{
        struct jpeg_decompress_struct cinfo;
        struct jpeg_error_mgr jerr;
        
        unsigned char *jpeg_buf;
        unsigned long size;
        
        unsigned char *buffer;
        int x, y;

cinfo.err = jpeg_std_error(&jerr);
        jpeg_create_decompress(&cinfo);

// come from logo.o, see detail with $ arm-linux-objdump -ht logo.o
        jpeg_buf = (unsigned char *)&_binary_logo_jpg_start;
        size = (unsigned long)&_binary_logo_jpg_size;
        // memory
        jpeg_mem_src(&cinfo, jpeg_buf, size);
        
        jpeg_read_header(&cinfo, TRUE);
        jpeg_start_decompress(&cinfo);

if ((cinfo.output_width > fb_width) || (cinfo.output_height > fb_height)) {
                printf("too large JPEG file,cannot display\n");
                return -1;
        }
        buffer = (unsigned char *) malloc(cinfo.output_width * cinfo.output_components);
        //printf("%d %d\n", cinfo.output_width, cinfo.output_components); /*eg, 240 3(rgb888)*/
        x = y = 0;
        while (cinfo.output_scanline < cinfo.output_height) {
                jpeg_read_scanlines(&cinfo, &buffer, 1);
                if (fb_depth == 16) {
                        unsigned short  color;
                        for (x=0; x < cinfo.output_width; x++) {
                                color = make16color(buffer[x*3], buffer[x*3+1], buffer[x*3+2]);
                                // the pic frome (45, 200)
                                fb_pixel(x + 45, y + 200, color);
                        }
                } else if (fb_depth == 24) {
                        // not test
                        memcpy((unsigned char *) fb_mem + y * fb_width * 3,
                                   buffer, cinfo.output_width * cinfo.output_components);
                }
                y++;        // next scanline
        }

jpeg_finish_decompress(&cinfo);
        jpeg_destroy_decompress(&cinfo);

free(buffer);
        return 0;
}

int main(int argc, char *argv[])
{
        fb_init();        // must call first
        
        jpeg_init();
        draw_jpeg();
        
        fb_release();
        return 0;
}

说明几点:
1、程序没有显式指定_binary_logo_jpg_start这几个符号的类型,编译器默认是int,如果用-Wall,会得到

warning: type defaults to 'int' in declaration of '_binary_logo_jpg_start'

的警告,如果要去掉警告,就将它们几个声明为int。
2、程序使用jpeg_mem_src函数指定图片在内存的位置及大小,两者从&_binary_logo_jpg_start和&_binary_logo_jpg_size得到。为了去除编译器的警告,进行了类型转换。

jpeg_buf = (unsigned char *)&_binary_logo_jpg_start;
 size = (unsigned long)&_binary_logo_jpg_size;

3、由于这个程序将会与其它程序合并,因此将图片放到合适的位置,代码:

fb_pixel(x + 45, y + 200, color);

即图片起点在(45, 200)处。
效果图如下:

更正:原文后面的“合同”为笔误,已更正为“合并”,发表后约三天发现。

将图片嵌入程序文件的测试相关推荐

  1. 将图片嵌入程序文件的一点研究

    背景: 重读<程序员的自我修养--链接.装载与库>,里面第3章主要讲目标文件.同时讲到如何将一些二进制文件作为目标文件的一个段(详细的请参考此书). 像图片.音乐文件其实也是二进制文件(作 ...

  2. 网络知识入门,Web服务器的CGI程序,浏览器如何判断响应内容:文本,图片还是音频文件?(十九)

    目录 将请求的uri转换为实际的文件名 运行CGI程序 web服务器的访问控制 浏览器接受响应并返回内容 浏览器接受响应消息后如何显示内容 浏览器显示网页内容:访问完成 将请求的uri转换为实际的文件 ...

  3. 正确理解以下名词及其含义1源程序,目标程序,可执行程序2程序编辑,程序编译,程序连接3程序,程序模块,程序文件4函数,主函数,被调用函数,库函数5程序调试,程序测试

    正确理解以下名词及其含义: (1)源程序,目标程序,可执行程序. 源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令目标程序:为源程序经编译可直接被计算机运行 ...

  4. 程序显示文本框_python PDF转成图片小程序

    你有没有遇到过这样一个需求:把一批PDF文件转存成图片,或者说把某一个文件夹内所有的pdf文件都转换成图片.PDF文件转存成图片格式有很多种方法,可以使用PDF编辑器或者上传到专门转格式的网站上.但是 ...

  5. iframe嵌入页面白屏_封闭在家学网页制作!为页面嵌入PDF文件——零基础自学网页制作

    在页面中嵌入PDF文件 在上一篇<在html页面中嵌入其他页面的方法--零基础自学网页制作>(结尾见目录)中我们学习了如何在页面中嵌入其他页面的操作.今天我们来嵌入一个pdf文件. 其实使 ...

  6. 手机程序开发和测试关注点整理

    最近公司要组建手机测试部门,总结一下自己3年多做手机开发的经验,都是零星的木有条例,希望有帮助.大家有其他好的可以留言,互相交流. 手机做为受限设备,从受限角度来考虑,他是屏幕尺寸受限,计算能力受限, ...

  7. 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究

    目前市面上已经有很多游戏采用了把图片缓存到玩家客户端的做法,这种方法有利有弊,因为并不是所有的玩家都希望自己的电脑的某个角落被放入过多的缓存文件,久而久之造成电脑性能下降:但是总的来说这种技术还是好的 ...

  8. Python批量导入图片到Word文件

    问题背景:2017年4月应华章公司邀请,翻译一本来自美国的Python入门教材,全书共750页,2018年4月完成翻译交稿,2018年9月责任编辑寄来样稿进行印刷前校对.经过半个月的检查和校对,又进行 ...

  9. python爬网络图片脚步_关于python:如何从本地计算机或网络资源将图像或图片嵌入jupyter笔记本中?...

    我想将图像包括在Jupyter笔记本中. 如果执行以下操作,则可以正常工作: from IPython.display import Image Image("img/picture.png ...

最新文章

  1. 软件架构设计学习总结(1):标准Web系统的架构分层
  2. C# 多线程之Thread类
  3. jchdl - 初次使用建立项目示例
  4. IP头、TCP头、UDP头详解以及定义
  5. 你大爷还是你大爷!三星震撼首发折叠屏智能手机Galaxy Fold
  6. leetcode 206 如何原地反转单链表?
  7. 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)...
  8. xp怎样修改计算机mac地址,xp系统怎么修改mac地址
  9. 基于simulink的微电网虚拟同步发电机vsg控制系统仿真
  10. 计算机专业助我成长作文600,挫折助我成长作文(精选6篇)
  11. 卓有成效的管理者-时间管理篇
  12. 293、Java中级10 -【多线程】 2020.03.31
  13. Python3爬取新浪微博头条
  14. 瑞芯微RK3288处理器详细信息介绍(参数,规格,应用,差异)
  15. 【老九学堂】【C++】位运算符
  16. Unity-Live2d(模型参数设置,当前参数保存与恢复所保存参数, 部分位置透明度设置,自动眨眼)
  17. 什么是金手指,金手指的设计要求有哪些?
  18. 租车出行如何避免踩坑,区块链技术解决信任问题
  19. 白苹果了怎么办_建行储蓄卡云闪付bug还款玩法(苹果和安卓机攻略)
  20. AI矩形描边内外同时设置,居中对齐

热门文章

  1. “蔚小理”将齐聚港股!蔚来申请在港IPO,计划3月10日上市 9个月亏损近19亿元...
  2. 前苹果M1芯片设计总监跳槽英特尔 或将负责所有SoC架构设计
  3. 双11节后“回血” 85后们来转转上“摆地摊”出售 闲置物品
  4. Canalys:尽管面临供应压力 2021年智能手机的出货量仍预计增长12%
  5. 机构研究显示iPhone 12 Pro Max是美国最受欢迎5G手机
  6. 高通CEO:已向美国申请向华为出售芯片 但尚未有回应
  7. 拼多多:钟汉良出任“百亿补贴”星推官
  8. 拼多多再次超越京东:盘中市值一度超700亿美金
  9. 美女,真的有标准吗?
  10. 41款App存在违规收集用户信息 明年将制定个人信息保护法