Cocos2dx:来自android的乱码图像

时间:2015-03-24 16:59:32

标签: android c++ bitmap java-native-interface cocos2d-x

注意:使用最新的cocos 2.x

你好。我尝试通过jni传递位图并将其转换为精灵来显示,但使用CCTexture2d initWithData 创建的图像完全出现乱码。我在这里查看了其他论坛帖子,但即使在尽可能密切关注这些帖子之后,也没有任何效果。请注意,我们不会使用图像的路径(并且它不是一个选项)。

我会分解一些问题:

需要哪种数据?

initWithData方法没有关于它甚至需要什么样的数据的文档 - 字节数组?像素阵列?似乎其他人已经使用了字节数组并使其工作,所以这就是我们所用的。这是获取字节数组的代码,但是我们应该使用PNG还是JPEG格式?

ByteArrayOutputStream bAOS = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,100, bAOS);
byte[] bytes = bAOS.toByteArray();

将数据发送到cocos

我们正在使用其他一些便捷方法将jni消息写为json数据,并将其转换为 CCDictionary 。 Byte数组变成了一堆int的CCArray,然后我们可以遍历并分配...到什么样的数组? "字节"不是c ++中的有效原语。在线我见过 int 数组:

CCArray *bytes = (CCArray*)dictionary->objectForKey("bytes");
int byteArray[bytes->count()];
for (int i = 0; i < bytes->count(); i++) {
CCNumber *v = (CCNumber*)bytes->objectAtIndex(i);
byteArray[i] = v->getIntValue();
};

我也尝试了 char 数组,但都没有用。

CCTexture2d? CCImage吗

好的,现在我们有了假想的字节数组,我们可以渲染图像。我们使用CCTexture2d还是CCImage?

对于CCTexture2d(我们知道图像是20x20像素):

CCTexture2D *texture = new CCTexture2D();
texture->initWithData(byteArray,kCCTexture2DPixelFormat_RGBA8888,20,20,CCSizeMake(20,20));

图像乱码。

对于CCImage ...长度是多少?我已经看到长度计算为图像高度*图像高度,或者作为字节数组的实际长度。你的猜测和我一样好,因为我从来没有让CCImage工作过。

CCImage *image = new CCImage();
image->initWithImageData(byteArray,length,CCImage::kFmtPng,20,20,8);

一旦我们有了CCImage,我们就可以使用CCTexture2d的initWithImage函数将其设置为纹理。

现在我们有了Texture,用它做一个精灵应该很简单:

CCSprite *sprite = CCSprite::createWithTexture(texture);

哪个有效,就像创建精灵一样多。虽然图像很垃圾。

那么,这究竟出了什么问题? 我们如何从位图获取数据? 我们如何制作cocos可以呈现的数据? Texture2d还是Image?参数是什么?

对于踢球,这是我们正在测试的图像:

Test bitmap

这是Android报告的字节数组:

[-119,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,40,0,0,0,40,8,2,0,0,0,3,-100,47,58,0,0,0,3,115,66,73,84,8,8,8,-37,-31,79,-32,0,0,0,-71,73,68,65,84,88,-123,-19,-44,-79,13,-125,48,16,-123,-31,-97,8,-118,-48,96,37,-108,40,-70,34,3,-48,-91,-124,81,24,-115,77,48,27,-64,6,-98,32,50,19,-112,5,48,-123,69,20,41,-36,-55,-35,-45,-13,-41,-100,-114,21,-30,-34,64,-45,48,-60,-74,-41,11,63,26,-123,21,86,88,97,-123,21,86,-8,-60,112,106,-101,-56,-90,-61,11,83,48,-10,6,39,44,38,-108,39,-51,16,9,11,69,-117,8,-127,-81,-89,-102,-66,99,-82,67,-11,116,108,35,97,88,-124,121,-81,109,-4,78,120,-66,-27,82,88,-31,-81,77,26,-35,-12,20,19,66,-32,-128,92,51,-71,21,46,47,-19,-15,-80,67,122,58,-61,-10,109,-86,114,-9,122,-40,-22,-19,-114,-121,23,-52,76,13,-19,102,-6,-52,-20,-67,112,73,57,-122,-22,-25,91,46,-123,21,-2,63,-8,3,120,-72,71,35,-19,75,10,-28,0,0,0,0,73,69,78,68,-82,66,96,-126]

这是结果(图像不是20 x 20,虽然可以通过cocos来缩放以适应密度),

Broken image

非常感谢任何帮助

0 个答案:

没有答案