本文的目的是介绍PHPGD库添加freetype拓展的方法的详细情况,特别关注phpgd扩展的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解PHPGD库添加freet
本文的目的是介绍PHP GD库添加freetype拓展的方法的详细情况,特别关注php gd扩展的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解PHP GD库添加freetype拓展的方法的机会,同时也不会遗漏关于android – LibGDX gdx-freetype BlueStacks、com.badlogic.gdx.graphics.g2d.freetype.FreeType.Face的实例源码、com.badlogic.gdx.graphics.g2d.freetype.FreeType.SizeMetrics的实例源码、com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData的实例源码的知识。
本文目录一览:- PHP GD库添加freetype拓展的方法(php gd扩展)
- android – LibGDX gdx-freetype BlueStacks
- com.badlogic.gdx.graphics.g2d.freetype.FreeType.Face的实例源码
- com.badlogic.gdx.graphics.g2d.freetype.FreeType.SizeMetrics的实例源码
- com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData的实例源码
PHP GD库添加freetype拓展的方法(php gd扩展)
背景:业务需求要用到 imagefttext 函数,发现GD库一开始安装时没有添加 FreeType
linux版本 centos 6.6
安装流程(由于服务器为分布式内网服务器,无法使用yum安装,以下均为下载资源包后的编译安装):
安装freetype
解压freetype-2.3.9.tar.gz
编译安装
./configure --enable-static --enable-shared (没有指定prefix,.h文件默认安装到 /usr/local/include, .a|.so文件默认安装到 /usr/local/lib内 其他资源包的安装如果没有指定目录也是一样到这个位置)
make && make install
确认freetype 安装成功后重新编译安装GD库,添加freetype 支持
安装gd库,版本2.0.35
由于之前有安装记录,建议先make clean,否则可能导致安装失败
./configure --enable-shared --with-jpeg=/usr/local/include/ --with-freetype=/usr/local/ --with-png=/usr/local/include/
在这个目录内,改为上一级目录后引入成功)
确认 Support for Freetype 2.x library: yes
make && make install
确认安装成功后重新编译安装PHP的gd拓展
PHP版本5.5.38
单独安装gd拓展模块需要cd 到 PHP-5.5.38/ext/gd
执行 PHPize 生成编译文件,如果系统没有引入PHPize,这个文件在PHP安装目录下的bin中
在这里一定要先执行make clean,这次安装了8台服务器,没有先执行make clean的100%没有安装成功,都没有添加到freetype support
./configure --with-PHP-config=/opt/PHP5.5.38/bin/PHP-config --with-jpeg-dir --with-png-dir --with-freetype-dir --with-zlib-dir --with-gd
确认freetype 2 在编译中已被添加
make && make install
确认新生成的.so文件是否跟PHP.ini中原来引入的路径相同,如果不同需要修改PHP.ini 中的extension
安装成功后重启PHP-fpm
ps axu |grep PHP |grep -v 'grep'|awk '{print $2}'|xargs kill -9
/PHP5.5.38/sbin/PHP-fpm
重启成功后查看PHPinfo中的gd是否包含
finished
以上这篇PHP GD库添加freetype拓展的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小编。
总结
以上是小编为你收集整理的PHP GD库添加freetype拓展的方法全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
PHP相关文章
- • 使用ThinkPHP+Uploadify实现图片上传功
- • JQuery打造PHP的AJAX表单提交实例
- • PHP生成图片验证码、点击切换实例
- • PHP实现无限级分类(递归方法)
- • php连接及读取和写入mysql数据库的常用
- • PHP网站安装程序的原理及代码
- • PHP备份/还原MySQL数据库的代码
- • PHP上传压缩包并自解压方法
- • php实现MySQL数据库备份与还原类实例
- • php mysql数据库操作类
android – LibGDX gdx-freetype BlueStacks
但仍然:
11-08 21:14:10.280: E/AndroidRuntime(1378): FATAL EXCEPTION: GLThread 9 11-08 21:14:10.280: E/AndroidRuntime(1378): com.badlogic.gdx.utils.GdxRuntimeException: Couldn''t load shared library ''gdx-freetype'' for target: Linux,32-bit 11-08 21:14:10.280: E/AndroidRuntime(1378): at com.badlogic.gdx.utils.SharedLibraryLoader.load(SharedLibraryLoader.java:110) 11-08 21:14:10.280: E/AndroidRuntime(1378): at com.badlogic.gdx.graphics.g2d.freetype.FreeType.initFreeType(FreeType.java:541) 11-08 21:14:10.280: E/AndroidRuntime(1378): at com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.<init>(FreeTypeFontGenerator.java:64) 11-08 21:14:10.280: E/AndroidRuntime(1378): at com.axl.where.test.create(test.java:153) 11-08 21:14:10.280: E/AndroidRuntime(1378): at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:334) 11-08 21:14:10.280: E/AndroidRuntime(1378): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1356) 11-08 21:14:10.280: E/AndroidRuntime(1378): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118) 11-08 21:14:10.280: E/AndroidRuntime(1378): Caused by: java.lang.UnsatisfiedLinkError: Couldn''t load gdx-freetype: findLibrary returned null 11-08 21:14:10.280: E/AndroidRuntime(1378): at java.lang.Runtime.loadLibrary(Runtime.java:429) 11-08 21:14:10.280: E/AndroidRuntime(1378): at java.lang.System.loadLibrary(System.java:554) 11-08 21:14:10.280: E/AndroidRuntime(1378): at com.badlogic.gdx.utils.SharedLibraryLoader.load(SharedLibraryLoader.java:106) 11-08 21:14:10.280: E/AndroidRuntime(1378): ... 6 more
有任何想法吗 ? LibGDX 0.9.9
解决方法
http://libgdx.badlogicgames.com/nightlies/dist/extensions/gdx-freetype/x86/
另外,你正在使用v0.9.6文件o.O使用nightlies:
http://libgdx.badlogicgames.com/nightlies/dist/extensions/gdx-freetype/
com.badlogic.gdx.graphics.g2d.freetype.FreeType.Face的实例源码
static UnderlineMetrics deriveUnderlineMetrics(FreeTypeFontGenerator generator,int size) { try { // Size metrics aren't publicly accessible (as of 1.9.3). (Ab)use reflection to gain access. Field faceField = FreeTypeFontGenerator.class.getDeclaredField("face"); faceField.setAccessible(true); Face face = (Face)faceField.get(generator); SizeMetrics sizeMetrics = face.getSize().getMetrics(); int yScale = sizeMetrics.getYscale(); // 16.16 fixed point float position = FreeType.toInt(face.getUnderlinePosition() * yScale >> 16); float thickness = FreeType.toInt(face.getUnderlineThickness() * yScale >> 16); return new UnderlineMetrics(position,thickness); } catch (Exception e) { LOG.error("Error fetching FreeType underline metrics",e); } // Return a reasonable default return UnderlineMetrics.defaultInstance(size); }
com.badlogic.gdx.graphics.g2d.freetype.FreeType.SizeMetrics的实例源码
static UnderlineMetrics deriveUnderlineMetrics(FreeTypeFontGenerator generator,int size) { try { // Size metrics aren't publicly accessible (as of 1.9.3). (Ab)use reflection to gain access. Field faceField = FreeTypeFontGenerator.class.getDeclaredField("face"); faceField.setAccessible(true); Face face = (Face)faceField.get(generator); SizeMetrics sizeMetrics = face.getSize().getMetrics(); int yScale = sizeMetrics.getYscale(); // 16.16 fixed point float position = FreeType.toInt(face.getUnderlinePosition() * yScale >> 16); float thickness = FreeType.toInt(face.getUnderlineThickness() * yScale >> 16); return new UnderlineMetrics(position,thickness); } catch (Exception e) { LOG.error("Error fetching FreeType underline metrics",e); } // Return a reasonable default return UnderlineMetrics.defaultInstance(size); }
/** Uses ascender and descender of font to calculate real height that makes all glyphs to fit in given pixel size. Source: * http://nothings.org/stb/stb_truetype.h / stbtt_ScaleForPixelHeight */ public int scaleForPixelHeight (int height) { setPixelSizes(0,height); SizeMetrics fontMetrics = face.getSize().getMetrics(); int ascent = FreeType.toInt(fontMetrics.getAscender()); int descent = FreeType.toInt(fontMetrics.getDescender()); return height * height / (ascent - descent); }
/** Uses max advance,ascender and descender of font to calculate real height that makes any n glyphs to fit in given pixel * width. * @param width the max width to fit (in pixels) * @param numChars max number of characters that to fill width */ public int scaleForPixelWidth (int width,int numChars) { SizeMetrics fontMetrics = face.getSize().getMetrics(); int advance = FreeType.toInt(fontMetrics.getMaxAdvance()); int ascent = FreeType.toInt(fontMetrics.getAscender()); int descent = FreeType.toInt(fontMetrics.getDescender()); int unscaledHeight = ascent - descent; int height = unscaledHeight * width / (advance * numChars); setPixelSizes(0,height); return height; }
/** Uses ascender and descender of font to calculate real height that makes all glyphs to fit in given pixel size. Source: * http://nothings.org/stb/stb_truetype.h / stbtt_ScaleForPixelHeight */ public int scaleForPixelHeight (int height) { if (!bitmapped && !FreeType.setPixelSizes(face,height)) throw new GdxRuntimeException("Couldn't set size for font"); SizeMetrics fontMetrics = face.getSize().getMetrics(); int ascent = FreeType.toInt(fontMetrics.getAscender()); int descent = FreeType.toInt(fontMetrics.getDescender()); return height * height / (ascent - descent); }
/** Uses max advance,ascender and descender of font to calculate real height that makes any n glyphs to fit in given pixel width. * @param width the max width to fit (in pixels) * @param numChars max number of characters that to fill width */ public int scaleForPixelWidth(int width,int numChars) { SizeMetrics fontMetrics = face.getSize().getMetrics(); int advance = FreeType.toInt(fontMetrics.getMaxAdvance()); int ascent = FreeType.toInt(fontMetrics.getAscender()); int descent = FreeType.toInt(fontMetrics.getDescender()); int unscaledHeight = ascent - descent; int height = unscaledHeight * width / (advance * numChars); if (!bitmapped && !FreeType.setPixelSizes(face,height)) throw new GdxRuntimeException("Couldn't set size for font"); return height; }
/** Returns null if glyph was not found. If there is nothing to render,for example with varIoUs space characters,then bitmap * is null. */ public GlyphAndBitmap generateGlyphAndBitmap (int c,int size,boolean flip) { setPixelSizes(0,size); SizeMetrics fontMetrics = face.getSize().getMetrics(); int baseline = FreeType.toInt(fontMetrics.getAscender()); // Check if character exists in this font. // 0 means 'undefined character code' if (face.getCharIndex(c) == 0) { return null; } // Try to load character if (!loadChar(c)) { throw new GdxRuntimeException("Unable to load character!"); } GlyphSlot slot = face.getGlyph(); // Try to render to bitmap Bitmap bitmap; if (bitmapped) { bitmap = slot.getBitmap(); } else if (!slot.renderGlyph(FreeType.FT_RENDER_MODE_norMAL)) { bitmap = null; } else { bitmap = slot.getBitmap(); } GlyphMetrics metrics = slot.getMetrics(); Glyph glyph = new Glyph(); if (bitmap != null) { glyph.width = bitmap.getWidth(); glyph.height = bitmap.getRows(); } else { glyph.width = 0; glyph.height = 0; } glyph.xoffset = slot.getBitmapLeft(); glyph.yoffset = flip ? -slot.getBitmapTop() + baseline : -(glyph.height - slot.getBitmapTop()) - baseline; glyph.xadvance = FreeType.toInt(metrics.getHoriAdvance()); glyph.srcX = 0; glyph.srcY = 0; glyph.id = c; GlyphAndBitmap result = new GlyphAndBitmap(); result.glyph = glyph; result.bitmap = bitmap; return result; }
/** Returns null if glyph was not found. If there is nothing to render,boolean flip) { if (!bitmapped && !FreeType.setPixelSizes(face,size)) throw new GdxRuntimeException("Couldn't set size for font"); SizeMetrics fontMetrics = face.getSize().getMetrics(); int baseline = FreeType.toInt(fontMetrics.getAscender()); // Check if character exists in this font. // 0 means 'undefined character code' if (FreeType.getCharIndex(face,c) == 0) { return null; } // Try to load character if (!FreeType.loadChar(face,c,FreeType.FT_LOAD_DEFAULT)) { throw new GdxRuntimeException("Unable to load character!"); } GlyphSlot slot = face.getGlyph(); // Try to render to bitmap Bitmap bitmap; if (bitmapped) { bitmap = slot.getBitmap(); } else if (!FreeType.renderGlyph(slot,FreeType.FT_RENDER_MODE_LIGHT)) { bitmap = null; } else { bitmap = slot.getBitmap(); } GlyphMetrics metrics = slot.getMetrics(); Glyph glyph = new Glyph(); if (bitmap != null) { glyph.width = bitmap.getWidth(); glyph.height = bitmap.getRows(); } else { glyph.width = 0; glyph.height = 0; } glyph.xoffset = slot.getBitmapLeft(); glyph.yoffset = flip ? -slot.getBitmapTop() + baseline : -(glyph.height - slot.getBitmapTop()) - baseline; glyph.xadvance = FreeType.toInt(metrics.getHoriAdvance()); glyph.srcX = 0; glyph.srcY = 0; glyph.id = c; GlyphAndBitmap result = new GlyphAndBitmap(); result.glyph = glyph; result.bitmap = bitmap; return result; }
com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData的实例源码
@Override public void create () { boolean flip = false; batch = new SpriteBatch(); if (flip) { OrthographicCamera cam = new OrthographicCamera(); cam.setToOrtho(flip); cam.update(); batch.setProjectionMatrix(cam.combined); } font = new BitmapFont(Gdx.files.internal("data/arial-15.fnt"),flip); FileHandle fontFile = Gdx.files.internal("data/arial.ttf"); FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile); FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.size = 15; parameter.flip = flip; parameter.genMipMaps = true; FreeTypeBitmapFontData fontData = generator.generateData(parameter); ftFont = generator.generateFont(parameter); generator.dispose(); }
/** * Convenience method for generating a font,and then writing the fnt and * png files. Writing a generated font to files allows the possibility of * only generating the fonts when they are missing,otherwise loading from a * prevIoUsly generated file. * * @param fontFile * @param fontSize * @param destiny */ private void generateFiles(String fontName,FileHandle fontFile,int fontSize,int pageWidth,int pageHeight,FileHandle destiny) { FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile); pixmapPacker packer = new pixmapPacker(pageWidth,pageHeight,pixmap.Format.RGBA8888,2,false); FreeTypeFontParameter param = new FreeTypeFontParameter(); param.packer = packer; param.characters = FreeTypeFontGenerator.DEFAULT_CHARS; param.size = fontSize; param.flip = false; FreeTypeFontGenerator.FreeTypeBitmapFontData fontData = generator .generateData(param); saveFontToFile(fontData,fontSize,fontName,packer,destiny); generator.dispose(); packer.dispose(); }
private void saveFontToFile(FreeTypeBitmapFontData data,String fontName,pixmapPacker packer,FileHandle destiny) { FileHandle fontFile = Gdx.files.absolute(destiny.file() .getAbsolutePath() + File.separator + fontName + ".fnt"); // .fnt // path BitmapFontWriter.setoutputFormat(BitmapFontWriter.OutputFormat.Text); String[] pageRefs = BitmapFontWriter.writepixmaps(packer.getPages(),destiny,fontName); // png dir path Gdx.app.debug(TAG,String.format( "Saving font [%s]: fontfile: %s,pixmapDir: %s\n",fontFile,destiny)); BitmapFontWriter.writeFont(data,pageRefs,new BitmapFontWriter.FontInfo(fontName,fontSize),1,1); }
@Override public BitmapFont loadSync (AssetManager manager,String fileName,FileHandle file,FreeTypeFontLoaderParameter parameter) { if(parameter == null) throw new RuntimeException("FreetypeFontParameter must be set in AssetManager#load to point at a TTF file!"); FreeTypeFontGenerator generator = manager.get(parameter.fontFileName + ".gen",FreeTypeFontGenerator.class); FreeTypeBitmapFontData data = generator.generateData(parameter.fontParameters); BitmapFont font = new BitmapFont(data,data.getTextureRegions(),false); font.setownsTexture(true); return font; }
@Override public BitmapFont loadSync( AssetManager manager,BitmapFontParameter parameter ) { int fontSize = 10; String scrubbedFileName = fileName; int qMark = fileName.lastIndexOf( "?" ); if ( qMark != -1 ) { scrubbedFileName = scrubbedFileName.substring( 0,qMark ); Matcher m = argsPtn.matcher( fileName ); m.region( qMark+1,fileName.length() ); while ( m.lookingAt() ) { if ( m.group( 1 ).equals( "size" ) ) { fontSize = Integer.parseInt( m.group( 2 ) ); } if ( m.group( 3 ).length() > 0 ) break; // Hit the "#" separator. m.region( m.end(),fileName.length() ); } } boolean flip = parameter != null ? parameter.flip : false; FreeTypeFontGenerator generator = new FreeTypeFontGenerator( file ); FreeTypeBitmapFontData data = generator.generateData( fontSize,FreeTypeFontGenerator.DEFAULT_CHARS,flip ); generator.dispose(); return new BitmapFont( data,true ); }
关于PHP GD库添加freetype拓展的方法和php gd扩展的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – LibGDX gdx-freetype BlueStacks、com.badlogic.gdx.graphics.g2d.freetype.FreeType.Face的实例源码、com.badlogic.gdx.graphics.g2d.freetype.FreeType.SizeMetrics的实例源码、com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData的实例源码的相关知识,请在本站寻找。
本文标签: