1、如何从BMP图片读取每个像素,然后根据PNG图片的格式以及RGB色彩算法,将BMP像素转换成png图片,最后根据PNG格式输出到文件。
例程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
FILE *fp = NULL;
char buf[PNG_BYTES_TO_CHECK];
LPSTR lpszFileName = lpszPathName;
if(!lpszFileName) return false;
//打开a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y4PyuBnvf4uh7BnH0vnjDk0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnWc4nHcvnHc" target="_blank" class="baidu-highlight"PNG文件/a
if(NULL == (fp = fopen(lpszFileName,"rb")))
{
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
//验证是否为a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y4PyuBnvf4uh7BnH0vnjDk0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnWc4nHcvnHc" target="_blank" class="baidu-highlight"PNG文件/a
if(fread(buf,1,PNG_BYTES_TO_CHECK,fp) != PNG_BYTES_TO_CHECK)
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
if( 0 != png_sig_cmp((unsigned char*)buf,(png_size_t)0,PNG_BYTES_TO_CHECK))
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
//以下代码读取a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y4PyuBnvf4uh7BnH0vnjDk0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnWc4nHcvnHc" target="_blank" class="baidu-highlight"PNG文件/a
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
unsigned int sig_read = PNG_BYTES_TO_CHECK;
int color_type = 0,interlace_type = 0;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
if( NULL == png_ptr)
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
info_ptr = png_create_info_struct(png_ptr);
if(NULL == info_ptr)
{
fclose(fp);
png_destroy_read_struct(png_ptr,info_ptr,png_infopp_NULL);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
png_init_io(png_ptr,fp);
png_set_sig_bytes(png_ptr,sig_read);
png_read_info(png_ptr,info_ptr);
if(info_ptr-bit_depth == 16)png_set_strip_16(png_ptr);
if(info_ptr-color_type == PNG_COLOR_TYPE_GRAY info_ptr-pixel_depth 8)
png_set_gray_1_2_4_to_8(png_ptr);
switch (info_ptr-pixel_depth)
{
case 32:
if (info_ptr-color_type PNG_COLOR_MASK_COLOR)png_set_bgr(png_ptr);
png_set_invert_alpha(png_ptr);
//当为32位图像是应该如何处理,例如
//pDib-CreateDIB(info_ptr-width, info_ptr-height,32);
break;
case 24:
{
png_color_16 my_background={0,255,255,255,0};
png_set_background(png_ptr,my_background,
PNG_BACKGROUND_GAMMA_SCREEN,0,1.0);
if (info_ptr-color_type PNG_COLOR_MASK_COLOR)png_set_bgr(png_ptr);
//当为32位图像是应该如何处理,例如
//pDib-CreateDIB(info_ptr-width, info_ptr-height,24);
}
break;
case 8:
case 4:
//当为32位图像是应该如何处理,例如
//if(info_ptr-num_palette0)
//{
// DWORD *pRQ=new DWORD[info_ptr-num_palette];
// for(int i=0;iinfo_ptr-num_palette;i++)
// {
// pRQ[i]=RGB(info_ptr-palette[i].red,info_ptr-palette[i].green,info_ptr-palette[i].blue);
// }
// pDib-CreateDIB(info_ptr-width, info_ptr-height,info_ptr-pixel_depth,pRQ,info_ptr-num_palette);
// delete[] pRQ;
//}
break;
default:
return false;
}
png_bytepp prow_pointers = new png_bytep[info_ptr-height];
UINT nRowBytes = png_get_rowbytes(png_ptr,info_ptr);
UINT row;
for(row=0;rowinfo_ptr-height;row++)
prow_pointers[row]=new BYTE[nRowBytes];
png_read_image(png_ptr,prow_pointers);
png_read_end(png_ptr,info_ptr);
//拷贝转换后的图像数据
for(row=0;rowinfo_ptr-height;row++)
memcpy(pDib-m_lpImage+(info_ptr-height-row-1)*pDib-m_nByteWidth,
prow_pointers[row],pDib-m_nByteWidth);
2、更简单的方法:用windows自带的图片和传真查看器打开要转换的图片,点击右下角的保存按钮,弹出保存对话框,选择要保存的类型。笔者经实验可转换的类型为gif,bmp,png,jpg.最大的优点是方便且不失。
这个还不简单……,开始,运行,mspaint,打开你的图片,另存为选bmp格式就完了,改分辨率不就是改大小么,用photoshop改吧,自己摸索一下,很好用的。
利用单片机技术、带彩信协议GPRS 无线通信模块、图像捕获和图像压缩编码功能模块,实现原理图设计到电路板设计开发。用单片机根据seNSor 控制串口摄像头图像采集和压缩处理,采集图像通过彩信的格式发送到用户手机,同时可以通过短信命令随时查看系统状态,或者摄像头采集图像,监控现场情况。
如果需要具体点的 我把完整文件给你发过去
有这样一个二进制文件,大小在100M左右,里面存放了多张JPG图片,文件格式如下:
无关数据区
JPG图片数据区
无关数据区
JPG图片数据区
无关数据区
JPG图片数据区
......
已知JPG图片起始标志为:“FF D8 FF E0 00 10 4A”,结束标志为:“FF D9”。
现想把这些JPG图片数据从该文件中读出来,生成一个个单独的图片文件,该如何做呢?
帮你写了个程序, 测试了只含有一个图片信息的文件
int len=0;
int filesn=0;
void ReadJpg(CFile *sfp,const char *dstfile,unsigned char a,unsigned char b)
{
CFile nf;
nf.Open(dstfile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
unsigned t=0,t1=0;
nf.Write(a,sizeof(char));
nf.Write(b,sizeof(char));
while(1)
{
sfp-Read(t,sizeof(char));
len++;
nf.Write(t,sizeof(char));
if(t==0xFF)
{
sfp-Read(t1,sizeof(char));
len++;
if(t1==0xD9)
break;
else
nf.Write(t1,sizeof(char));
}
}
nf.Close();
}
调用:
void test()
{
CFile fp;
fp.Open("86b05621.jpg",CFile::modeRead|CFile::typeBinary);//文件名改一下
unsigned char a=0,b=0;
len=0;
while(1)
{
fp.Read(a,sizeof(char));
len++;
if(len=fp.GetLength())
break;
if(a==0xFF)
{
fp.Read(b,sizeof(char));
len++;
if(b==0xD8)
{
filesn++;
char filename[256];
sprintf(filename,"Jpg %d.jpg",filesn);
ReadJpg(fp,filename,a,b);
}
}
}
fp.Close();
}
思路是,先得到FF的值,然后再判断下一位是否是0xD8, 但这里要说明一下,如果你的其它数据信息里也含有FF D8值的话就会出错了, 所以为保险起见,应该再多比较几位, JPG的头是固定的,再往下就是EF E0 00 1E, 建议楼主再往下比较四位比较保险(在程序中稍作修改即可)
你是不是在 分析某个 游戏的或程序的资源文件呀,如果是的话,这个资源文件应该配有一个 索引文件!或在其文件自身。索引可以列表索引,链表形示……
如果是你自已生成的文件包,最好加上索引,因为这样可以提高效率!
楼主还不了解HTTP协议,HTML代码及其他资源都不是一次发请求的,先请求HTML,服务返回类型为text/html 然后浏览器分析HTML代码 如果存在其他资源 比如图片的话 然后再去请求图片 服务求收到请求 然后 返回图片数据 HEAD类型就是 image/jpg 或者 image/gif image/png 之类,总之,客户端请求什么 服务器返回相应类型的内容就行了
有以下几个原因:
1:图像的尺寸与程序中显示的范围不一致。例如图像原本是20*10的,而程序图像显示范围中却错误地设为30*10,显示出来的东西就会乱。
2:取模时候的取模顺序要与显示时候的显示顺序相一致。例如取模时候是水平、自上而下取的,显示时候也要设为水平、自上而下显示出每个像素。这个至关重要,一般都是这个设错了所以会乱码。
3:液晶屏一般以16位二进制数表示一个像数的颜色,例如蓝色是0xFF00。而取模软件取模后,数据一般存放在一个char型的数组里,这样一个像素的颜色被拆成两半放在数组的两个元素中,如const char xxx[]={0xFF,0x00},这时候用户要自己把它合成一个16位的数据,这时候用户就要注意高低位数据的顺序了,不要合成0x00FF,这样图像出来后就会乱。
单片机显示jpg格式图片的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:单片机显示jpg格式图片