Paint_Bmp

(原创)裸奔 第2章 学习总结

    上次,做图片显示实验,没有看如果转换的图片不是320X240,将会显示什么。这次玩LCD,提示我,看看在显示图片的时候,不是屏幕分辨率大小的,会是什么现象。

      首先,调用显示图片的函数:
      Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[]),x0,y0表示在屏幕上的显示位置(同时也是原作者所说的bug所在),h为图片的宽度,l为图片的高度。bmp[]为存储图片信息的数组。
     于是,我就在网上下了一张图片分辨率为:220X161,这样调用函数 Paint_Bmp(0,0,220, l61,small),small就是包好图片220X161信息的数组,放在TQ_LOGO.c中。发现小图片的地方能够显示在屏幕上。但余下没有被赋值的像素点,保存着上一张图片的信息。
      改变y0的值,图片可以上下移动。但是如果改变x0的值,图片却花了,不能正常显示。并不是想像中的左右移。这是因为,LCD是被逐行扫描的,首先填充第1行,逐渐填充到第240行。你改变y0的值,相当于改变了行数,而你改变x0数,就改变了列数。但在small中信息都是按行列存储好了。你改变了x0,把原本属于第一行像素的值,变成了第二行。所以后面的信息全都乱了套。因为small数组是一个一维数组,并不是按照行列存储信息的二维数组。
    

Paint_Bmp函数分析:  

     void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
{

int x,y;   ------x、y逐行扫描计数
U32 c; -------存储一个像素点的信息
int p = 0;  

   for( y = y0 ; y < l ; y++ ) --------逐行扫描
  
{
    for( x = x0 ; x < h ; x++ )
------一行有h-x0个像素
    
{
       c = bmp[p+1] | (bmp[p]<<8) ;
--------数组中的每2个值,作为一个像素点的值,共16位

    if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) ) -----在LCD.h中定义为320X240
     LCD_BUFFER[y0+y][x0+x] = c ;
-----将像素的值,赋值给数组。
   
    p = p + 2 ; --------因为数组中的2个值,代表一个像素
   }
    }
}

所以,在裸奔程序中,原作者改了程序。使小程序能够显示,可以调节x0、y0改变图片位置。

   关于kobe篮,RGB,兴趣不是很大。对那个算法,研究兴趣不是很大,不必浪费时间。

 

 

 

若将x0 y0 h l 当做首和尾坐标,那么可以写成

void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
{
 int x,y;
 U32 c;
 int p = 0;
 
    for( y = y0 ; y < l ; y++ )
    {
     for( x = x0 ; x < h ; x++ )
     {
      c = bmp[p+1] | (bmp[p]<<8) ;

 //  if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )
 //   LCD_BUFFER[y0+y][x0+x] = c ;
     if ( ( (x) < SCR_XSIZE_TFT) && ( (y) < SCR_YSIZE_TFT) )
     LCD_BUFFER[y][x] = c;
   
      p = p + 2 ;
     }
    }
}

结果和原作者修改的一样

 

### 使用 `cairo_surface_write_to_bmp` 函数保存图像到 BMP 文件 Cairo 是一个强大的图形库,支持多种绘图操作以及不同格式的文件输出。为了使用 `cairo_surface_write_to_bmp` 将 Cairo 表面对象写入位图文件,可以按照如下方式编写代码: ```c #include <cairo.h> #include <stdio.h> int main() { // 创建一个新的宽度为 200 像素、高度为 100 像素的内存表面 cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 200, 100); // 获取上下文用于绘制 cairo_t *cr = cairo_create(surface); // 设置源颜色为蓝色并填充整个区域 cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); // 蓝色 cairo_paint(cr); // 绘制一条红色线段作为例子 cairo_set_line_width(cr, 9.0); cairo_set_source_rgb(cr, 0.7, 0.2, 0.0); // 红色 cairo_move_to(cr, 80, 50); cairo_line_to(cr, 140, 50); cairo_stroke(cr); // 将当前的内容写出至名为 "example.bmp" 的 bmp 文件中 if (cairo_surface_write_to_png(surface, "example.bmp") != CAIRO_STATUS_SUCCESS) { // 此处应为 cairo_surface_write_to_bmp,但 API 实际不存在此名称,请参见下文说明[^1] fprintf(stderr, "Failed to write image file.\n"); return 1; } printf("Image successfully written as 'example.bmp'\n"); // 清理资源 cairo_destroy(cr); cairo_surface_destroy(surface); return 0; } ``` 需要注意的是,在上述示例中的最后一行调用了 `cairo_surface_write_to_png()` 方法而不是请求的 `cairo_surface_write_to_bmp()`。这是因为官方文档并没有提供直接命名为 `write_to_bmp` 的接口;对于想要导出成 BMP 格式的开发者来说,通常会先通过 PNG 或者其他中间格式保存再转换。 如果确实需要生成 BMP 文件,则可能需要借助第三方工具或额外处理来完成最终的目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值