android - हरण - नाम ऑफ़ आउटपुट डिवाइस



क्या मैं अलग-अलग आकारों/आयामों के लिए इनपुट और आउटपुट आवंटन को रेन्डर्स लिपि पर सेट कर सकता हूं? (1)

यहाँ जाता हैं:

  1. क्या इसका मतलब है कि मैं इस प्रकार का ऑपरेशन नहीं कर सकता हूं?

नहीं वास्तव में नहीं। आपको बस चीजों को सही ढंग से शिल्प करना होगा

  1. क्या इसका मतलब यह है कि मैं विभिन्न आकार / आयामों के आवंटन का उपयोग नहीं कर सकता हूं?

नहीं, लेकिन इसका मतलब यह है कि आप अलग-अलग आकार के आवंटन का उपयोग जिस तरह से आप वर्तमान में कर रहे हैं, उसका उपयोग नहीं कर सकते। डिफ़ॉल्ट कर्नेल में / आउट मेकनिज्म को इनपुट और आउटपुट आकारों की अपेक्षा होती है ताकि यह सभी तत्वों पर सही ढंग से पुनरावृत्त हो सके। अगर आपको कुछ अलग चाहिए, तो इसे प्रबंधित करने के लिए आप पर निर्भर है। उस पर और भी अधिक।

  1. क्या इस मुद्दे पर काबू पा सकता है ... कैसे?

सबसे आसान समाधान इनपुट के लिए एक आबंटन बनाने और इसे एक पैरामीटर के रूप में प्रदान करने के बजाय रेंडर्रिप्स्ड उदाहरण में बाँध करना होगा। तब आपके आरएस को केवल एक आउटपुट आवंटन (और आपके कर्नल में केवल आउटपुट, एक्स और वाई) की आवश्यकता होगी। वहां से आप यह निर्धारित कर सकते हैं कि इनपुट आवंटन के भीतर आप कौन-सी समन्वय चाहते हैं और इसे सीधे आउटपुट स्थान में रखें:

int inX = ...;
int inY = ...;
uchar4 curIn = rsGetElementAt_uchar4(inAlloc, inX, inY);
*out = curIn;
  1. वर्ग इनपुट और आउटपुट के मामले में मुझे बिटमैप में छेद क्यों मिलता है?

ऐसा इसलिए है क्योंकि आप इनपुट और आउटपुट आवंटन में ऑफसेट करने के लिए एक्स और वाई पैरामीटर का उपयोग नहीं कर सकते। वे / आउट पैरामीटर पहले से ही इनपुट और आउटपुट दोनों में सही (उसी) स्थान की ओर इशारा करते हैं। आप जो अनुक्रमित कर रहे हैं वह अनावश्यक है और वास्तव में समर्थित नहीं है। प्रत्येक बार आपके कर्नेल को बुलाया जाता है, इसे आवंटन के भीतर 1 तत्व स्थान के लिए बुलाया जा रहा है। यही कारण है कि पैरामीटर के रूप में प्रदान किए जाने पर इनपुट और आउटपुट आकार समान होने चाहिए।

पृष्ठभूमि

मैं रेन्डरस्क्रिप्ट सीखने की कोशिश कर रहा हूं, इसलिए मैं कुछ सरल आपरेशन करने की कोशिश करना चाहता हूं जो मुझे लगता है।

समस्या

मैंने एक बिटमैप को घूर्णन करने के बारे में सोचा, जो कुछ ऐसा है जो प्रबंधन के लिए काफी आसान है।

सी / सी ++ पर, यह करना एक सरल बात है ("jniRotateBitmapCw90" के लिए खोज करें):

https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations/blob/master/JniBitmapOperationsLibrary/jni/JniBitmapOperationsLibrary.cpp

बात यह है, जब मैं रेन्डर्सक्रिप्ट पर यह कोशिश करता हूं, तो मुझे यह त्रुटि मिलती है:

android.support.v8.renderscript.RSRuntimeException: मापदंडों Ain और aout के बीच आयाम बेमेल!

यहां मैं क्या करता हूं:

RS:

void rotate90CW(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
    // XY. ..X ... ... 
    // ...>..Y>...>Y..
    // ... ... .YX X.. 
    out[...]=in[...] ...
}

जावा:

    mRenderScript = RenderScript.create(this);
    mInBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_photo);
    mOutBitmap = Bitmap.createBitmap(mInBitmap.getHeight(), mInBitmap.getWidth(), mInBitmap.getConfig());
    final Allocation input = Allocation.createFromBitmap(mRenderScript, mInBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    final Allocation output = Allocation.createFromBitmap(mRenderScript, mOutBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    ScriptC_test script = new ScriptC_test(mRenderScript, getResources(), R.raw.test);
    ...
    script.forEach_rotate90CW(input, output);
    output.copyTo(mOutBitmap);

यहां तक ​​कि जब भी मैं एक ही आकार (स्क्वायर बिटमैप) के दोनों आवंटन सेट करता हूं, और मैं आउटपुट को इनपुट के लिए सेट करता हूं:

out[width * y + x] = in[width * y+x];
  • तो मुझे जो मिलता है वह छेद के साथ एक बिटमैप है ... कैसे आए?

मुझे यही मिलता है:

प्रश्न

  1. क्या इसका मतलब है कि मैं इस प्रकार का ऑपरेशन नहीं कर सकता हूं?

  2. क्या इसका मतलब यह है कि मैं विभिन्न आकार / आयामों के आवंटन का उपयोग नहीं कर सकता हूं?

  3. क्या इस मुद्दे पर काबू पाने के लिए संभव है (और फिर भी बेशक, रेन्डर्रिप्ट का उपयोग करें)? यदि हां, तो कैसे? शायद मैं आरएस पक्ष के अंदर एक सरणी चर जोड़ सकता हूं, और उसके बजाय आवंटन सेट कर सकता हूं?

  4. वर्ग इनपुट और आउटपुट के मामले में मुझे बिटमैप में छेद क्यों मिलता है?

संपादित करें: यह मेरा वर्तमान कोड है:

रुपये

rs_allocation *in;  

uchar4 विशेषता ((कर्नेल)) rotate90CW (uint32_t x, uint32_t y) {// XY। ..एक्स ... ... // ...> .. वाई> ...> वाई .. // ... ... .यैक्स एक्स .. uchar4 curIn = rsGetElementAt_uchar4 (में, 0, 0) ; वापसी करिये; // बस परीक्षण के लिए ...}

जावा:

    mRenderScript = RenderScript.create(this);
    mInBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_photo);
    mOutBitmap = Bitmap.createBitmap(mInBitmap.getHeight(), mInBitmap.getWidth(), mInBitmap.getConfig());
    final Allocation input = Allocation.createFromBitmap(mRenderScript, mInBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    final Allocation output = Allocation.createFromBitmap(mRenderScript, mOutBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    ScriptC_test script = new ScriptC_test(mRenderScript, getResources(), R.raw.test);

    script.bind_in(input);
    script.forEach_rotate90CW(output);
    output.copyTo(mOutBitmap);
    mImageView.setImageBitmap(mOutBitmap);