2

URL からビットマップに画像を取得しようとしていて、ビットマップの生データを使用して CCSprite を作成しようとしています。ここでの問題は、スプライトを表示すると画像が破損することです。スタンドアロンの Android 専用アプリケーション (cocos2dx なし) を作成し、同じコードを使用してビットマップをフェッチして表示し、正しく表示しました。cocos2dx で画像が正しくレンダリングされない理由はありますか?

URL から画像を取得するための私のコードは次のとおりです。

String urlString = "http://www.mathewingram.com/work/wp-content/themes/thesis/rotator/335f69c5de_small.jpg";//http://graph.facebook.com/"+user.getId()+"/picture?type=large";
Bitmap pic = null;
pic = BitmapFactory.decodeStream((InputStream) new URL(urlString).getContent());
int[] pixels = new int[pic.getWidth() * pic.getHeight()];
pic.getPixels(pixels, 0, pic.getWidth(), 0, 0,pic.getWidth(),pic.getHeight());
int len = pic.getWidth()* pic.getHeight();
nativeFbUserName(pixels,len,pic.getWidth(), pic.getHeight());

関数 "nativeFbUserName" は、次のネイティブ C++ 関数への呼び出しです。

void Java_com_WBS_Test0001_Test0001_nativeFbUserName(JNIEnv *env, jobject thiz,jintArray name, jint len, jint width, jint height) {
jint *jArr = env->GetIntArrayElements(name,NULL);
int username[len];
for (int i=0; i<len; i++){
    username[i] = (int)jArr[i];
}
HelloWorld::getShared()->picLen = (int)len;
HelloWorld::getShared()->picHeight = (int)height;
HelloWorld::getShared()->picWidth = (int)width;
HelloWorld::getShared()->saveArray(username);
HelloWorld::getShared()->schedule(SEL_SCHEDULE(&HelloWorld::addSprite),0.1);
}
void HelloWorld::saveArray(int *arrayToSave)
{
arr = new int[picLen];
for(int i = 0; i < picLen; i++){
    arr[i] = arrayToSave[i];
}
}
void HelloWorld::addSprite(float time)
{
this->unschedule(SEL_SCHEDULE(&HelloWorld::addSprite));
CCTexture2D *tex = new CCTexture2D();
bool val = tex->initWithData(arr,(cocos2d::CCTexture2DPixelFormat)0,picWidth,picHeight, CCSizeMake(picWidth,picHeight));
CCLog("flag is %d",val);
CCSprite *spriteToAdd = CCSprite::createWithTexture(tex);
spriteToAdd->setPosition(ccp(500, 300));
this->addChild(spriteToAdd);
}

編集:だから私はこのリンクAccess to raw data in ARGB_8888 Android Bitmapを見つけました。これはバグである可能性があると述べています。誰かがこれに対する解決策を見つけましたか?

4

1 に答える 1

0

編集 画像の右下隅にある画像の破損に気付きました.なぜこれが起こっているのか、それを修正する方法はわかりません. 何か案は?

編集終了

私自身の質問に答えて、次を使用してビットマップからバイト配列を取得しました。

byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
pic.compress(Bitmap.CompressFormat.JPEG, 100, baos);
data = baos.toByteArray();

そして、このバイト配列をネイティブ コードに渡しました。

于 2013-02-10T16:30:10.363 に答える