void img_small3(const unsigned char *p){
int y, x,color;
//压缩1/4。每4个点失去1个,一行也就失去200。
for(y = 0;y < 360 ;y++)
{ if(!(y%3))p+=(800*3);//判断屏幕的行,然后跳过颜色的那一行,指向下一行,注意!(y%3)要加括号,要不然先执行!y
for(x = 0;x < 600; x++)
{
if (x%3)//判断是否到了消去的那个点的颜色值,600/200=3,注意不是%4
{
color =(*p<<16)+(*(p+1)<<8)+*(p+2);
*(fbuf + (800*y + x)) = color;
p+=3;
}else{//如果到了颜色值消去的那一点,颜色指针+3跳到下一个值
// *(fbuf + (800*y + x)) =0xffffff;
p+=3;
color =(*p<<16)+(*(p+1)<<8)+*(p+2);
*(fbuf + (800*y + x)) = color;
p+=3;
}
}//一行剩下的给白色。
for(x = 600;x < 800; x++)
{
*(fbuf + (800*y + x)) =0xffffff;
}
}//剩下的行给白色
for(y = 360;y < 480 ;y++)
{
for(x = 0;x < 800; x++)
{
*(fbuf + (800*y + x)) =0xffffff;
}
}
}
可以函数里传入z参数
void img_small4(const unsigned char *p){
int y, x,color,a,b,c,z=4;
// a=480-480/z;b=800-800/z;
//在裸机上,用除法会报错,http://blog.chinaunix.net/uid-26833883-id-3282967.html
//http://blog.csdn.net/yuanlu837/article/details/7958781
c=z-1;
for (a = 1; a < 800; a++)
{
if (a*z==800)
{//使用加法和乘法实现除法
a=800-a;
break;
}
}
for (b = 1; b < 480; b++)
{
if (b*z==480)
{
b=480-b;
break;
}
}
if (789<a||b>479)
{//防止一些不是整除的,就原画输出,但第一行和列还是会没。
printf("%d,%d\n",a,b);
a=800;
b=480;
c=1;
}
for(y = 0;y < b ;y++)
{ if(!(y%c))p+=(800*3);
for(x = 0;x <a; x++)
{
if (x%c)
{
color =(*p<<16)+(*(p+1)<<8)+*(p+2);
*(fbuf + (800*y + x)) = color;
p+=3;
}else{
// *(fbuf + (800*y + x)) =0xffffff;
p+=3;
color =(*p<<16)+(*(p+1)<<8)+*(p+2);
*(fbuf + (800*y + x)) = color;
p+=3;
}
}
for(x = a;x < 800; x++)
{
*(fbuf + (800*y + x)) =0xffffff;
}
}
for(y =b;y < 480 ;y++)
{
for(x = 0;x < 800; x++)
{
*(fbuf + (800*y + x)) =0xffffff;
}
}
}
也可以用加减法实现乘除法
for (a = 0; a < 800; ++a)
{
for (i=0; i < c; i++)
{
a=a+a;
}
if (a==800)
{
break;
}
}
for (b = 0; b < 480; ++b)
{
for (i=0; i < c; i++)
{
b=b+b;
}
if (b==480)
{
break;
}
}