Opengl es Android-在本机端加载图像

Opengl es Android-在本机端加载图像,opengl-es,android-ndk,Opengl Es,Android Ndk,我正在尝试加载图像,以便将它们用作纹理。我有libpng,但是如何找到图像的路径呢?把它放进apk是个坏主意吗?有更好的方法吗?看看这个: 似乎有两种方法可以做到这一点。我可以按照Simon N.的建议做,也可以将图像转换成C数组并编译成源代码。我选择做后者,因为我可以在本地轻松地做到。我甚至创建了一个python(v3.2),用于将png文件转换为c数组头和源文件。它需要 #/usr/bin/env python 导入png 进口稀土 进口itertools def grouper(n,ite

我正在尝试加载图像,以便将它们用作纹理。我有libpng,但是如何找到图像的路径呢?把它放进apk是个坏主意吗?有更好的方法吗?

看看这个:

似乎有两种方法可以做到这一点。我可以按照Simon N.的建议做,也可以将图像转换成C数组并编译成源代码。我选择做后者,因为我可以在本地轻松地做到。我甚至创建了一个python(v3.2),用于将png文件转换为c数组头和源文件。它需要

#/usr/bin/env python
导入png
进口稀土
进口itertools
def grouper(n,iterable,fillvalue=None):
args=[iter(iterable)]*n
返回itertools.zip_最长(fillvalue=fillvalue,*args)
def扩展(阵列):
新的_数组=[];
对于数组中的行:
对于第行中的v:
新的_数组。追加(v)
返回新的数组
def c_数组_名称(文件名):
''将文件名转换为c数组名''
返回re.sub(r'\W','\u',文件名)
def c_数组_头文件名(文件名):
''将文件名转换为c数组头文件名''
返回“{0}.h”。格式(文件名)
def c_数组_源_文件名(文件名):
''将文件名转换为c数组源文件名''
返回“{0}.cpp”。格式(文件名)
def c_数组_头(文件名):
''返回一个字符串,该字符串是c数组头,
哪里
文件名是png文件“”
名称=c_数组_名称(文件名)
返回“”
#ifndef{0}__
#定义{0}__
#包括
外部单位至少32个单位{1}[];
#endif/*.{0}.\u*/
“”。格式(name.upper(),name)
def c_数组_源(文件名、头文件名、数组字符串):
''返回一个字符串,该字符串是c数组源,
哪里
name是c_数组_name中的值
数组\字符串“”'
名称=c_数组_名称(文件名)
返回“”
#包括“{0}”
uint_least32_t const{1}[]{{
{2}
}};
“”格式(标题\文件名、名称、数组\字符串)
def convert_data_array_字符串(数据):
''返回字节的十六进制字符串,
哪里
数据是字节“”的映射
返回“,”
对于石斑鱼中的r、g、b、a(4,展开(数据),0)])
def png_文件中的数据(路径):
''返回png文件''的字节映射'
打开(路径“rb”)作为文件:
reader=png.reader(file=file)
data=reader.read();
返回列表(数据[2]);
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
导入操作系统
如果len(sys.argv)!=2:
sys.stdout.write(“{0}image_path.”格式(sys.argv[0]))
退出()
path=sys.argv[1]
filename=os.path.split(路径)[1]
头文件名=c\U数组头文件名(文件名)
sys.stdout.write(“创建头文件“{}”…”。格式(头文件名))
将打开的(头文件名“w”)作为头文件:
header_file.write(c_数组_头(文件名))
sys.stdout.write(“完成\n”)
source_filename=c_数组_source_文件名(filename)
sys.stdout.write(“创建源文件“{}”…”。格式(源文件名))
数据=png\U数据\U来自\U文件(路径)
打开(源文件名为“w”)作为源文件:
source_file.write(c_数组_源(文件名、头文件名、转换数据_数组_字符串(数据)))
del数据
sys.stdout.write(“完成\n”)
#!/usr/bin/env python

import png
import re
import itertools

def grouper(n, iterable, fillvalue=None):
    args = [iter(iterable)] * n
    return itertools.zip_longest(fillvalue=fillvalue, *args)

def expand(array):
    new_array = [];
    for row in array:
        for v in row:
            new_array.append(v)
    return new_array

def c_array_name(filename):
    '''converts the filename to the c array name'''
    return re.sub(r'\W', '_', filename)

def c_array_header_filename(filename):
    '''converts the filename to the c array header filename'''
    return "{0}.h".format(filename)

def c_array_source_filename(filename):
    '''converts the filename to the c array source filename'''
    return "{0}.cpp".format(filename)

def c_array_header(filename):
    '''returns a string that is the c array header,
    where
        filename is the png file'''
    name = c_array_name(filename)
    return """
#ifndef __{0}__
#define __{0}__

#include <stdint.h>

extern uint_least32_t const {1}[];

#endif /* __{0}__ */
""".format(name.upper(), name)

def c_array_source(filename, header_filename, array_string):
    '''returns a string that is the c array source,
    where
        name is the value from c_array_name
        array_string'''
    name = c_array_name(filename)
    return """
#include "{0}"

uint_least32_t const {1}[] = {{
{2}
}};
""".format(header_filename, name, array_string)

def convert_data_array_string(data):
    '''returns a string of hexes of bytes, 
    where
        data is a map of bytes'''
    return ", ".join(["0x{:02x}{:02x}{:02x}{:02x}".format(a, b, g, r)
        for r, g, b, a in grouper(4, expand(data), 0)])

def png_data_from_file(path):
    '''returns a map of bytes of the png file'''
    with open(path, 'rb') as file:
        reader = png.Reader(file = file)
        data = reader.read();
        return list(data[2]);

if __name__ == '__main__':
    import sys
    import os
    if len(sys.argv) != 2:
        sys.stdout.write("{0} image_path".format(sys.argv[0]))
        exit()
    path = sys.argv[1]
    filename = os.path.split(path)[1]
    header_filename = c_array_header_filename(filename)
    sys.stdout.write("Creating header file '{}'... ".format(header_filename))
    with open(header_filename, 'w') as header_file:
        header_file.write(c_array_header(filename))
    sys.stdout.write("done\n")
    source_filename = c_array_source_filename(filename)
    sys.stdout.write("Creating source file '{}'... ".format(source_filename))
    data = png_data_from_file(path)
    with open(source_filename, 'w') as source_file:
        source_file.write(c_array_source(filename, header_filename, convert_data_array_string(data)))
    del data
    sys.stdout.write("done\n")