qn1539141314

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314  发布于  2018-11-07 17:54:41
采纳率 0%
9个问答
2784

SDL库无法生成ARGB1555的图片是怎么回事?

 

参考了本论坛关于海思OSD的方法 http://bbs.ebaina.com/forum.php?mod=viewthread&tid=10879&extra=&page=2

http://bbs.ebaina.com/forum.php?mod=viewthread&tid=11772&highlight=SDL

写了代码测试将时间字符串转为ARGB1555;

[code]#include

include "SDL.h"

include "SDL_ttf.h"

include

int main(int argc, const char argv[]) { char pstr[18]; SDL_PixelFormat fmt; TTF_Font font; SDL_Surface text, *temp; time_t time_seconds = time(NULL); struct tm now_time; localtime_r(&time_seconds, &now_time); sprintf(pstr,"%04d-%02d-%02d %02d:%02d:%02d", now_time.tm_year + 1900, now_time.tm_mon + 1, now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec); if (TTF_Init() < 0 ) { fprintf(stderr, "Couldn't initialize TTF: %s\n", SDL_GetError()); SDL_Quit(); }

font = TTF_OpenFont("./simhei.ttf", 48);
if ( font == NULL )
{
    fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 18, "ptsize", SDL_GetError());
} 
  SDL_Color forecol= { 0xff, 0xff, 0xff, 0 };
  text = TTF_RenderUTF8_Solid(font, pstr, forecol);
  temp = SDL_CreateRGBSurface(SDL_SWSURFACE,text->w, text->h, 16 ,0x00000000, 0x00000000, 0x00000000,0x00000000);
  SDL_Rect bounds;
    if (temp != NULL)
    {
            bounds.x = 0;
            bounds.y = 0;
            bounds.w = text->w;
            bounds.h = text->h;
            if (SDL_LowerBlit(text, &bounds, temp, &bounds) < 0)
            {
                    SDL_FreeSurface(text);
                    SDL_SetError("Couldn't convert image to 16 bpp");
                    text = NULL;
                    return -1;
            }
    }
    else
    {
            printf("sdl  failed\n");
            return -1;
    }

SDL_SaveBMP(temp, "save.bmp");
SDL_FreeSurface(text);
SDL_FreeSurface(temp);
TTF_CloseFont(font);
TTF_Quit();

return 0;

} [/code]

以上代码依然只能生成24位的图像,不知道是否参数设置有问题?

我来回答
回答8个
时间排序
认可量排序

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314 2018-11-07 18:01:11
认可0
SDL库是1.2版本的,比较旧。所以SDL_PixelFormat中的成员好像不一样

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314 2018-11-07 18:21:05
认可0
以下是第二段代码:
[code]    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;
    fmt->Amask = 0x8000;
    fmt->Rmask = 0x7E00;          //ARGB1555
    fmt->Gmask = 0x03E0;
    fmt->Bmask = 0x001f;
    fmt->Ashift = 15;
    fmt->Rshift = 10;
    fmt->Gshift = 5;
    fmt->Bshift = 0;
    temp = SDL_ConvertSurface(text,fmt,0);
    SDL_SaveBMP(temp, "save.bmp");


    free(fmt);
    SDL_FreeSurface(text);
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);
    TTF_Quit();
[/code]

方法依然行不通

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-08 09:09:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=110968&ptid=53351]qn1539141314 发表于 2018-11-7 18:21[/url]
以下是第二段代码:


[/quote]

Amsk = 0x7E00 ?

是否是 0x7C00

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314 2018-11-08 09:31:37
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=110978&ptid=53351]zhuangweiye 发表于 2018-11-8 09:09[/url]
Amsk = 0x7E00 ?

是否是 0x7C00[/quote]

前辈,我试了一下还是生成的24位的。劳烦您再帮我看看代码,以下是完整代码:

[code]char pstr[18];
    SDL_PixelFormat *fmt;
    TTF_Font *font;
    SDL_Surface *text, *temp;
    time_t time_seconds = time(NULL);
    struct tm now_time;
    localtime_r(&time_seconds, &now_time);
    sprintf(pstr,"%04d-%02d-%02d %02d:%02d:%02d", now_time.tm_year + 1900, now_time.tm_mon + 1,
        now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
    if (TTF_Init() < 0 )
    {
        fprintf(stderr, "Couldn't initialize TTF: %s\n", SDL_GetError());
        SDL_Quit();
    }

    font = TTF_OpenFont("./simhei.ttf", 31);
    if ( font == NULL )
    {
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 18, "ptsize", SDL_GetError());
    }
      SDL_Color forecol= { 0xff, 0xff, 0xff, 0 };
      text = TTF_RenderUTF8_Solid(font, pstr, forecol);

    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;
    fmt->Amask = 0x8000;
    fmt->Rmask = 0x7c00;          //ARGB1555
    fmt->Gmask = 0x03E0;
    fmt->Bmask = 0x001f;
    fmt->Ashift = 15;
    fmt->Rshift = 10;
    fmt->Gshift = 5;
    fmt->Bshift = 0;
    temp = SDL_ConvertSurface(text,fmt,0);
    SDL_SaveBMP(temp, "save.bmp");


    free(fmt);
    SDL_FreeSurface(text);
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);
    TTF_Quit();

    return 0;
}
[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-08 09:50:04
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=110984&ptid=53351]qn1539141314 发表于 2018-11-8 09:31[/url]
前辈,我试了一下还是生成的24位的。劳烦您再帮我看看代码,以下是完整代码:[/quote]

不明白,什么东西是24位的?save.bmp 还是tmp->pixels

存bmp的目的是什么?OSD 直接用SDL_Surface中的tmp->pixels 不就好了

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314 2018-11-08 09:55:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=111000&ptid=53351]zhuangweiye 发表于 2018-11-8 09:50[/url]
不明白,什么东西是24位的?save.bmp 还是tmp->pixels

存bmp的目的是什么?OSD 直接用SDL_Surface中的 ...[/quote]

save.bmp 是24位,因为还没有写后续的代码,所以只是看看生成bmp图片是否是ARGB1555的,前辈,save.bmp不是依赖于tmp->pixels生成的吗?如果不是的话,我就继续写后续的代码了

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-08 10:19:26
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=111001&ptid=53351]qn1539141314 发表于 2018-11-8 09:55[/url]
save.bmp 是24位,因为还没有写后续的代码,所以只是看看生成bmp图片是否是ARGB1555的,前辈,save.bmp不 ...[/quote]

save.bmp 当然依赖tmp->pixels, 但依赖不等于说save.bmp是24bits的,就确定tmp->pixels是24bits的


qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314 2018-11-08 11:02:26
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=111005&ptid=53351]zhuangweiye 发表于 2018-11-8 10:19[/url]
save.bmp 当然依赖tmp->pixels, 但依赖不等于说save.bmp是24bits的,就确定tmp->pixels是24bits的[/quote]

还真是这样,已经成功了,谢谢大神指点!
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区