【问题标题】:C compiler error: cannot convert to a pointer typeC 编译器错误:无法转换为指针类型
【发布时间】:2012-09-08 19:19:24
【问题描述】:

我正在尝试将 FreeType 库与 libpng 一起使用来输出字形的 PNG 图像。我可以创建字形的光栅位图,也可以创建有效的 PNG 文件,但我似乎无法将两者放在一起。问题出在接近尾声的这一行:

png_bytep image = (png_bytep) slot->bitmap;

似乎我不能简单地将 FreeType 位图转换为 png_bytep 并将其传递给 pnglib(这是一厢情愿的想法)。我收到以下错误:

/home/david/Desktop/png.c: In function ‘main’:
/home/david/Desktop/png.c:47:2: error: cannot convert to a pointer type

但是,我不确定如何从这里开始。但这是完整的代码块:

#include <stdlib.h>
#include <stdio.h>
#include <png.h>

#include <ft2build.h>
#include FT_FREETYPE_H

main() {

    // Declare FreeType variables
    FT_Library library;
    FT_Face face;
    FT_GlyphSlot slot = face->glyph;
    FT_UInt glyph_index;
    int pen_x, pen_y, n;
    char* file = "/usr/share/fonts/truetype/freefont/FreeMono.ttf";

    // Declare PNG variables
    png_uint_32 width = 100;
    png_uint_32 height = 100;
    int bit_depth = 16;
    int color_type = PNG_COLOR_TYPE_GRAY;
    char* file_name = "/home/david/Desktop/out.png";
    png_structp png_ptr;
    png_infop info_ptr;

    // Render font
    FT_New_Face(library, file, 0, &face);
    FT_Set_Pixel_Sizes(face, 0, 16);
    glyph_index = 30;
    FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
    FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

    // Create a PNG file
    FILE *fp = fopen(file_name, "wb");

    // Create the PNG in memory
    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    info_ptr = png_create_info_struct(png_ptr);
    png_init_io(png_ptr, fp);

    // Write the header
    png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
    png_write_info(png_ptr, info_ptr);

    // Write image data
    png_bytep image = (png_bytep) slot->bitmap;
    png_write_image(png_ptr, &image);

    // End write
    png_write_end(png_ptr, NULL);

    fclose(fp);
}

【问题讨论】:

    标签: c


    【解决方案1】:
    void png_write_image(png_structp png_ptr, png_bytepp image);
    typedef png_byte        FAR * FAR * png_bytepp;
    typedef unsigned char png_byte;
    

    所以 png_write_image 正在寻找 unsigned char far * far * 类型的输入。

    http://en.wikipedia.org/wiki/Far_pointer如果你对远的意思感兴趣的话。

    现在,如果您查看您的 FT_GlyphSlot 类型,您会发现:

    typedef struct  FT_GlyphSlotRec_
      {
    ...
    FT_Bitmap         bitmap;
    ...
    }
    
    typedef struct  FT_Bitmap_
    {
      int             rows;
      int             width;
      int             pitch;
      unsigned char*  buffer;
      short           num_grays;
      char            pixel_mode;
      char            palette_mode;
      void*           palette;
    } FT_Bitmap;
    

    所以要获得正确的类型,您需要&amp;slot-&gt;bitmap.buffer

    不需要演员表。

    【讨论】:

    • 谢谢!与 Tar 的答案相同,但更深入一点。不过,这两个答案都很好!并且仍在尝试找出“渲染字体”部分中发生的段错误。有任何想法吗? :-)
    【解决方案2】:

    看来您应该传递&amp;image 而不是图像。

    【讨论】:

    • 谢谢。这清除了一些错误,但主要错误是相同的。我会更新帖子。
    【解决方案3】:

    你可能想要 slot->bitmap.buffer 而不是 slot->bitmap

    slot->bitmap 是一个 FT_Bitmap,一种结构类型,还包含位图宽度等。

    【讨论】:

    • 啊,成功了。它编译!现在有一个段错误要处理,但我想这可能是一个不同的问题:-)。谢谢!
    • 在使用freetype之前,您需要调用FT_Init_FreeType(&amp;library)FT_GlyphSlot slot = face-&gt;glyph; 应该在创建面部的函数调用下方。下一个问题出现在您使用 libpng 的某个地方。
    • 天才。又对了。现在,段错误发生在“渲染字体”代码的下方。我想你还有什么建议吗? ;-)
    • 你告诉 libpng 位图是 100x100,freetype 不太可能提供这个,不是吗?
    • 确实,“FT_Set_Pixel_Sizes”调用导致了段错误。现在正在调查...
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2015-09-17
    • 2021-09-20
    • 2013-10-09
    相关资源
    最近更新 更多