Fresco: を䜿甚した䜎画質<image/> RNのコンポヌネント&gt; = 0.57Fresco&gt; = 1.10.0

䜜成日 2019幎08月22日  Â·  57コメント  Â·  ゜ヌス: facebook/fresco

説明

RNの問題 RN 0.57.xバンドルされた倧きな画像は、\を䜿甚しお衚瀺するず品質が䜎くなりたす。

Androidでのみ、バンドルされた倧きな画像PNG、GIF、およびJPEGではなく、より倚くの圢匏をロヌドするず、品質が䜎䞋したす。

巊偎のスクリヌンショットには、 RN 0.56.0で実行されおいるたったく同じコヌドが衚瀺され、右偎のスクリヌンショットには、 RN0.57.1​​が衚瀺されおいたす。 コヌドは単玔な画像<Image source={require('./assets/ELHall1.png')} resizeMethod="resize" />で、画像サむズは2111 x 4645 pixelsです。 䞡方のプロゞェクトは、 react-native init RN057ImageTestずreact-native init --version="0.56.0" RN056ImageTestを䜿甚しお新しくむンストヌルされたす。 これは、0.56以降、および最新のRN0.60.x以降のすべおのバヌゞョンで匕き続き発生したす。

これは、RN Frescolibが0.56から0.57の間で1.9.0から1.10.0に倉曎されたこずが原因であるこずが確認されおいたすhttps://github.com/facebook/react-native/commit/b6f2aad9c0119d11e52978ff3fa9c6f269f04a14。 コメントhttps://github.com/facebook/react-native/issues/21301#issuecomment-520155609を確認しおください。

Frescoの問題を怜玢したずころ、倧きな画像を1぀ず぀分割しお再構成する必芁があるずいう関連する問題がいく぀か芋぀かりたした。これにより、倚くの堎合ほずんどのマップ関連の倧きな画像が解決されたすが、特に動的に読み蟌たれる堎合は非垞に䞍䟿です。 /䜜成された画像。 これは、RN 0.56たでおよび0.57以降は機胜しおいたしたが、その埌は機胜したせんでした。

再生

RNこれは最初のApp.jsで、 <Image/>コンポヌネントが远加されおいたす。

...
type Props = {};
export default class App extends Component<Props> {
  render() {
    return (
      <View style={styles.container}>
        <Image source={require('./assets/ELHall1.png')} resizeMethod="resize" />
      </View>
    );
  }
}
...

远加情報

このコメントhttps://github.com/facebook/react-native/issues/21301#issuecomment-520418832で、 lambdapioneerは、これはおそらく倧きな画像の瞮小サブサンプリングに関連しおいるず曞いおいたす。

これは、Frescoが倧きな画像を瞮小サブサンプリングする方法に関連しおいるず思いたすこれは、メモリずパフォヌマンスの問題にずっお重芁な機胜です。 その間、䞻にネむティブコヌドの䟝存関係を削陀しお、.soの䞍満なリンク゚ラヌを枛らすために、これらの領域にいく぀かの倉曎が加えられたした。 ぀たり、それは別の倧きな改善の副䜜甚かもしれたせん。

  • フレスコバヌゞョン> = 1.10.0
  • プラットフォヌムバヌゞョンRN> = 0.57、すべおのAndroidバヌゞョン
enhancement

最も参考になるコメント

@CaptainNそれは倱瀌ではありたせん。 問題は、私がそれを実行し、すべおの゚ラヌに盎面したこずです。そのため、Frescoのむンストヌルずパッチの適甚方法の説明を含むスタヌタヌリポゞトリを䜜成するのにかかる時間ははるかに短くなりたす。

だからここにありたす https 

RN 0.61.5たす。 リポゞトリには詳现な手順がありたす。 Frescoのクロヌンを䜜成し、 v2.1.0をチェックアりトし、 DecodeProducer.javaパッチを適甚しお、ダりンサンプルコヌドをコメントアりトしたす。 Android NDKをダりンロヌドしお、 libraries/fresco/local.propertiesファむルを远加するだけです。 それはすべおreadmeで詳しく説明されおいたす。

指瀺ずyarnスクリプトに埓うず、既存のRN> = 0.60_たたは叀いバヌゞョン_プロゞェクトにfrescolibを远加できたす。

党おのコメント57件

ねえ、最近この問題に関する掻動はなかったようです。 問題は修正されたしたか、それずもコミュニティの泚意が必芁ですか それ以䞊のアクティビティが発生しない堎合、この問題は解決される可胜性がありたす。 この問題に「バグ」たたは「拡匵」ずいうラベルを付けるこずもできたす。この問題は開いたたたにしおおきたす。 貢献しおいただきありがずうございたす。

RN 0.56.0および0.57.1​​で䜿甚されおいるFrescoのバヌゞョンは䜕ですか これにより、これを匕き起こした可胜性のあるコミットの数が絞り蟌たれたす。

こんにちは@oprisnik 、

https://github.com/facebook/react-native/issues/21301#issuecomment -520155609が正確に報告しおいるず思い。どのバヌゞョンからこの動䜜が倉曎されたした。

こんにちは@clytras 、私はこのリポゞトリの画面に画像を芋぀けたした。
写真をダりンロヌドするず、2111幅* 4645高さの写真が芋぀かりたした。

Frescoは、OpenGLの制限に合うように画像をダりンサンプリングしたす。デフォルトの画像の最倧幅/高さは、この行のハヌドコヌドです。

私の意芋では、
簡単な方法は、ResizeOptionのmaxBitmapSizeフィヌルドを倉曎するこずです。
正しい方法は、非垞に倧きな画像を衚瀺するためにFrescoを䜿甚しないこずです。

他のりィゞェットを䜜成し、このラむブラリを䜿甚しお非垞に倧きな画像を衚瀺するこずは、倚くのAndroidチヌムの遞択です。

こんにちは@ s1rius 、あなたが未解決の問題の投皿を読ん

コヌドは単玔な画像です画像サむズは2111x4645ピクセルです

これは、RN> = 0.57から発生し、Fresco1.9.0から1.10.0に倉曎された動䜜の倉曎に関するものです。 そのような倧きな画像は、そのバヌゞョンの前にフル品質で動䜜し、読み蟌たれおいたした。 RN repoの寄皿者は、これはRNの問題ではなく、Fresco libの問題であるず述べおいるため、この問題をクロヌズしたした。 その行動的な倉曎が意図的に行われた堎合は、この問題を解決できたす。 はい、回避策はありたすが、これはバヌゞョンたで機胜しおいたしたが、突然、理由に関する情報がなく、機胜しなくなりたした。

ねえ、最近この問題に関する掻動はなかったようです。 問題は修正されたしたか、それずもコミュニティの泚意が必芁ですか それ以䞊のアクティビティが発生しない堎合、この問題は解決される可胜性がありたす。 この問題に「バグ」たたは「拡匵」ずいうラベルを付けるこずもできたす。この問題は開いたたたにしおおきたす。 貢献しおいただきありがずうございたす。

長期間䜿甚されなかった埌、この問題を解決したす。 この問題が最新リリヌスでも匕き続き発生する堎合は、最新情報を䜿甚しお再開しおください。

これを匕き起こした可胜性のある朜圚的な倉曎は、 https//github.com/facebook/fresco/commit/fa71901055a38a810c190862c7fd582fd3dad2b3です

それが問題のある倉曎であるかどうかを確認できたすか

こんにちは@oprisnikそしおこれを調査しおくれおありがずう。

私はgradleず、ラむブラリをダりンロヌドする代わりに゜ヌスから盎接フレスコ画をコンパむルするようにRNを倉曎する方法にあたり詳しくありたせん。 私が成功せずに取ったステップ

  1. react-native-cliを䜿甚しおRN0.57プロゞェクトを䜜成したす
  2. frescolibをプロゞェクトのルヌトディレクトリにクロヌンしたす
  3. fresco lib内のv1.10.0ブランチぞのチェックアりト
  4. android-ndk-r20パスを<Project>\android\local.properties  ndk.dir=G:\\Dev\\Android\\android-ndk-r20 に远加したす

次に、SO https://stackoverflow.com/a/52861379/1889685でこの回答を芋぀けたした。これは、゜ヌスからフレスコ画を䜿甚しおRNをコンパむルし、ラむブラリをオヌバヌラむドしたす。

cd android
./gradlew assembleDebug --include-build /e/Sandbox/RN057ImageTest/fresco/

しかし、次の゚ラヌが発生したす。

> Task :fresco:imagepipeline:ndk_build_bitmaps FAILED
A problem was found with the configuration of task ':fresco:imagepipeline:ndk_build_bitmaps'. Registering invalid inputs and outputs via TaskInputs and TaskOutputs methods has been deprecated and is scheduled to be removed in Gradle 5.0.
 - File 'E:\Sandbox\RN057ImageTest\fresco\imagepipeline\src\main\jni\bitmaps' specified for property '$1' is not a file.

@sunnylqmは、このプロセスに非垞に粟通しおいるため、時間があればこれをテストできるかもしれたせ

それが圹に立ったら、私はこれたでに持っおいるものでリポゞトリを䜜成するこずができたす。

ねえ、最近この問題に関する掻動はなかったようです。 問題は修正されたしたか、それずもコミュニティの泚意が必芁ですか それ以䞊のアクティビティが発生しない堎合、この問題は解決される可胜性がありたす。 この問題に「バグ」たたは「拡匵」ずいうラベルを付けるこずもできたす。この問題は開いたたたにしおおきたす。 貢献しおいただきありがずうございたす。

ビルドしようずしたしたが、ndk゚ラヌも発生したした。 テストできるナむトリヌビルドはありたすか

倉曎を加えずにv2.0.0をコンパむルできるので、別の方法で怜蚌しおみたした。 䞊蚘のコミットによっお有効になるダりンサンプリングを無効にしたした。結果は次のずおりです。

テスト画像URI
" https://wagonsclub.oss-cn-beijing.aliyuncs.com/static/carousel/carousel1_bg.jpg "

Fragment_drawee_simple.xml

  <com.facebook.drawee.view.SimpleDraweeView
      android:id="@+id/drawee_view"
      android:layout_width="match_parent"
      android:layout_height="1000dp"
      />

オリゞナルのv2.0.0ショヌケヌス
image

ダりンサンプリングv2.0.0ショヌケヌスを無効にしたした
image

@sunnylqmこれをデバッグしおくれおありがずう。 ダりンサンプリングを無効にするにはどうすればよいですか 次の方法を詊したしたが、成功したせんでした。

MainApplication.java onCreate 

<strong i="10">@Override</strong>
public void onCreate() {
  super.onCreate();

  ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
    .setDownsampleEnabled(false)
    .build();

  Fresco.initialize(this, config);

  SoLoader.init(this, /* native exopackage */ false);
}

これにより、LogcatでFrescoがすでに初期化されおいるずいうメッセヌゞが衚瀺されたす。

MainReactPackageをMainPackageConfig初期化しお䜿甚した2番目の方法ですが、どちらも機胜したせんでした。

protected List<ReactPackage> getPackages() {
  Context context = getApplicationContext();
  ImagePipelineConfig pipelineConfig = ImagePipelineConfig
    .newBuilder(context.getApplicationContext())
    .setDownsampleEnabled(false)
    .build();
  MainPackageConfig config = new MainPackageConfig.Builder().setFrescoConfig(pipelineConfig).build();

  return new ArrayList<>(Arrays.<ReactPackage>asList(
    new MainReactPackage(config),
    new ReactNativeFirebaseAppPackage(),
    new FastImageViewPackage(),
    new RNGestureHandlerPackage(),
    new ReanimatedPackage(),
    new SvgPackage()
  ));
}

@clytrasわからない。 ゜ヌスコヌドで無効にしたした。

ping @oprisnik

これは、React Nativeメむンパッケヌゞ構成を介しお蚭定されおいるようです https 

RNでどのように蚭定する必芁があるのか​​わからないので、詊したこずはありたせん。

@oprisnikこの問題を修正する蚈画はありたすか

この問題はただRNリポゞトリに属しおいるず思いたす。 画像のダりンサンプリングは、間違いなく、メモリコストを削枛し、効率を高め、倧きな画像をロヌドする際の煩雑さを軜枛するためのものです。 この問題は、゚ンド開発者がオプション/プロパティの圢匏で画像のダりンサンプリングを行うかどうかを遞択できるように、RNによっお凊理される必芁があるず思いたす。 たずえば、いく぀かの平面図を衚瀺するために倧きな画像を䜿甚する私のアプリでは、ナヌザヌが平面図を拡倧するずきに高解像床が必芁です。 私は垞にデバむスの機胜をチェックし、RAMが少ない、たたは䜎解像床のロヌ゚ンドデバむスの堎合は、より小さく、より䜎い解像床の画像をロヌドしたす。

scaleずresizeを持぀scale <Image/>コンポヌネントのresizeMethodプロパティがありたす。 RN currenltyは、そのプロパティのscale倀を尊重したせん。これは、画像のダりンサンプリングを無効にし、 resizeに蚭定した堎合にのみ有効にする必芁があるず思いたす。

resizeMethod

画像のサむズが画像ビュヌのサむズず異なる堎合に画像のサむズを倉曎するために䜿甚する必芁があるメカニズム。 デフォルトはautoです。

resize デコヌドされる前にメモリ内の゚ンコヌドされた画像を倉曎する゜フトりェア操䜜。 画像がビュヌよりもはるかに倧きい堎合は、 scale代わりにこれを䜿甚する必芁がありたす。

scale 画像は瞮小たたは拡倧されお描画されたす。 resizeず比范しお、 scaleはより高速で通垞はハヌドりェアアクセラレヌション、より高品質の画像を生成したす。 これは、画像がビュヌよりも小さい堎合に䜿甚する必芁がありたす。 画像がビュヌより少し倧きい堎合にも䜿甚する必芁がありたす。

この@ oprisnik

@clytrasあなたが蚀ったように、それは説明なしのフレスコ画の振る舞いの倉化です。 私が瀺すデモはフレスコレポのサンプルアプリですしたがっお、RNずは䜕の関係もないず思いたす。

@sunnylqmもちろん、これは説明のないフレスコ画の動䜜の倉曎ですが、RNは、このフレスコ画機胜の有効化/無効化の遞択を

たた、この動䜜の倉曎はもちろんiOSでは発生しないこずを忘れないでください。そのため、䜕かを行う必芁がありたす。フレスコ画の構成はReact Nativeで行われるため、この構成ぱンドRN開発者に公開する必芁があるず思いたす。

ずころで、私はFresco 2.0.0マスタヌブランチを最新のRN 0.61.2でコンパむルし、 コメントアりトするこずでダりンサンプリングを無効にしたした。

frescoリポゞトリディレクトリ内にlocal.propertiesファむルを䜜成し、 Windows64ビット

ndk.dir=G:\\Dev\\Android\\android-ndk-r19c
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true

Frescoバむナリは正垞にコンパむルされ、次を実行しおビルドされたRNアプリのむメヌゞダりンサンプリングが無効になっおいたす。

cd android
.\gradlew assembleDebug --include-build ..\fresco\

そうです、これに察する解決策は、RN初期化ロゞックを介しお、たたはFrescoが初期化されるずきに、アプリケヌションのダりンサンプリングを無効にするこずです。

@oprisnikでは、生成されたandroidプロゞェクト内でフレスコ画を初期化するためのより良いクリヌンで簡単な方法が必芁だず思いたす。これは私が詊したどの方法でも達成できたせんでした。 いく぀かのプロゞェクトがcom.facebook.imagepipeline.core.ImagePipelineConfig 、 com.facebook.react.shell.MainReactPackage 、 com.facebook.react.shell.MainPackageConfigを䜿甚しお、蚭定をMainReactPackageに枡すこずにより、 getPackagesメ゜ッド内で初期化するのを芋おきたしたが、これは、私が詊した最新のRN0.61でもRN0.57でも機胜したせんでした。

protected List<ReactPackage> getPackages() {
  Context context = getApplicationContext();

  ImagePipelineConfig pipelineConfig = ImagePipelineConfig
    .newBuilder(context.getApplicationContext())
    .setDownsampleEnabled(false)
    .build();

  MainPackageConfig config = new MainPackageConfig.Builder()
    .setFrescoConfig(pipelineConfig)
    .build();

  return new ArrayList<>(Arrays.<ReactPackage>asList(
    new MainReactPackage(config),
    ...
  ));
}

たぶん私はそこで䜕か間違ったこずをしおいるのですが、 MainReactPackageは<project>/android/app/build/generated/rncli/src/main/java/com/facebook/react/ディレクトリ内にPackageList.javaファむルを生成する新しい> = 0.60リンクシステムでは間違いなく機胜したせんMainReactPackage匕数なしで枡され、自動リンクシステムを䜿甚しおどのような皮類の匕数も枡す方法がわかりたせんが、frescoconfigを䜿甚しおMainReactPackageを手動で枡しおみたしたが、それも機胜したせんでした。

React Native甚に生成されたAndroidプロゞェクト内で、カスタム構成を䜿甚しおfrescolibを初期化する方法に぀いおのクリヌンで文曞化された方法が必芁です。

https://frescolib.org/docs/resizing.htmlを読んだ埌、私が正しく理解しおいれば、 downsamplingはresizing代わりになりたす。 したがっお、 @ clytrasは正しいず思いたす。resizeMethodがscaleに蚭定されおいる堎合、ダりンサンプリングは有効になりたせん。

RNのコヌドは私には正しいようですhttps://github.com/facebook/react-native/blob/aee88b6843cea63d6aa0b5879ad6ef9da4701846/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java#L505  null倀をimagepipelineに枡したす。これは、サむズ倉曎/ダりンサンプリングがないこずを瀺したす
しかし、フレスコ画では、nullのresizeOptionsを尊重したせんhttps://github.com/facebook/fresco/blob/v2.0.0/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java#L158- L169
downsampleEnabledずdownsampleEnabledForNetwork䞡方がtrueの堎合、resizeOptionsがnullであるかどうかに関係なく、ダりンサンプリングされたす。
https://github.com/facebook/fresco/blob/master/imagepipeline-base/src/main/java/com/facebook/imagepipeline/transcoder/DownsampleUtil.java#L56
ですから、私にはドキュメントずコヌドの䞍䞀臎のようです。 たた、特定の画像をダりンサンプリングするかどうかを制埡するためのより柔軟な方法が必芁です。 珟圚は2぀のグロヌバル構成によっお制埡されおいたす @clytras @oprisnik

@sunnylqmでお疲れ様でした。 私は<Image/>コンポヌネントのRN構成を探しお远跡し始め、それらをチェックしたしたが、あなたは私を超えたした

このような動䜜の倉化があるので、どちらのフレスコもresizeOptionsがnullでない堎合にのみ、ダりンサンプリングをチェックしお適甚する必芁があるず思いたす。 これは、 resizeMethodがresize たたはautoおよびロヌカル画像の堎合に蚭定されおいる堎合にのみ蚭定され、 https//github.com/facebook/react-でチェックされshouldResize関数、たたは新しいresizeMethod列挙型があるはずです特にダりンサンプリングのオプション。

ねえ、最近この問題に関する掻動はなかったようです。 問題は修正されたしたか、それずもコミュニティの泚意が必芁ですか それ以䞊のアクティビティが発生しない堎合、この問題は解決される可胜性がありたす。 この問題に「バグ」たたは「拡匵」ずいうラベルを付けるこずもできたす。この問題は開いたたたにしおおきたす。 貢献しおいただきありがずうございたす。

@clytrasあなたはあなたの解決策を教えおもらえたすか

@ club9822今のずころ解決策は、ここで説明するように、最初に画像のダりンサンプリングを無効にした埌、゜ヌスからフレスコバむナリをコンパむルするこずですhttps://github.com/facebook/fresco/issues/2397#issuecomment -541802753

コアラむブラリを再コンパむルせずにこれを回避する方法はありたすか

@CaptainNこの問題の簡単な解決策はありたせん。 ゜ヌスをコンパむルするプロセスは困難で退屈に芋えるかもしれたせんが、実際にはいく぀かの小さな倉曎を加えおコマンドを実行する必芁がありたす。 この号の私の投皿をフォロヌしお、その方法を確認しおください。

@clytras new PackageList(this, config) 2番目の匕数でconfigを枡すこずができたす
そしお、実際に期埅通りに動䜜しおみたした。 問題は、ここのロゞックが構成を無芖したこずですhttps://github.com/facebook/fresco/blob/v2.0.0/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java#L158 - false堎合はL169
こんな感じでしょ

- if (mDownsampleEnabled || !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
+ if (mDownsampleEnabled && !statusHasFlag(status, Consumer.IS_RESIZING_DONE))

@oprisnik

@sunnylqm私はオフィスを離れおおり、今は確認できたせんが、新しい_RN> = 60_自動リンクシステムを䜿甚しお構成を枡す方法が芋぀からなかったこずを芚えおいたす。 でもわかりたせん。 叀い_RN_バヌゞョンでも機胜したせんでした。 䌑暇から戻った数日埌にチェックしたす。

私はそれがステヌタスがいない堎合は、今ダりンサンプリングは垞に適甚されるこずは明癜だずしお、問題を解決するこずをORしお、倉曎信じIS_RESIZING_DONE 、それは完党にバむパスしおフラグをmDownsampleEnabled 。 もちろん、ダりンサンプルを無効にするカスタムフレスコ蚭定が適甚されおフレスコに枡された堎合も同様です。

@clytrasgradleの非掚奚などであらゆる皮類の゚ラヌが発生したす。 ビルド前のバむナリを䜜成できるそしおむンストヌルする堎所を教えおください可胜性はありたすか 本圓にありがたいです。

ああ、それを忘れおください。 尋ねるのも倱瀌です。 私はそれを理解し、倚分PRに入れたす。

@CaptainNそれは倱瀌ではありたせん。 問題は、私がそれを実行し、すべおの゚ラヌに盎面したこずです。そのため、Frescoのむンストヌルずパッチの適甚方法の説明を含むスタヌタヌリポゞトリを䜜成するのにかかる時間ははるかに短くなりたす。

だからここにありたす https 

RN 0.61.5たす。 リポゞトリには詳现な手順がありたす。 Frescoのクロヌンを䜜成し、 v2.1.0をチェックアりトし、 DecodeProducer.javaパッチを適甚しお、ダりンサンプルコヌドをコメントアりトしたす。 Android NDKをダりンロヌドしお、 libraries/fresco/local.propertiesファむルを远加するだけです。 それはすべおreadmeで詳しく説明されおいたす。

指瀺ずyarnスクリプトに埓うず、既存のRN> = 0.60_たたは叀いバヌゞョン_プロゞェクトにfrescolibを远加できたす。

@clytrasそれを

䞊蚘のコメントが将来この問題に察凊するかどうかに぀いお䜕か蚀葉はありたすか

@sunnylqmが提案した倉曎をテストしたした

- if (mDownsampleEnabled || !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
+ if (mDownsampleEnabled && !statusHasFlag(status, Consumer.IS_RESIZING_DONE))

その倉曎埌、 MainApplication.java内の構成だけを䜿甚しおむメヌゞのダりンサンプルを無効にできたこずがわかりたした。぀たり、フレスコ画をコンパむルする必芁はなく、そこでフレスコ画の蚭定を倉曎するだけで枈みたす。

<strong i="12">@Override</strong>
protected List<ReactPackage> getPackages() {
  Context context = getApplicationContext();

  ImagePipelineConfig frescoConfig = ImagePipelineConfig
    .newBuilder(context)
    .setDownsampleEnabled(false)
    .build();

  MainPackageConfig appConfig = new MainPackageConfig
    .Builder()
    .setFrescoConfig(frescoConfig)
    .build();

  @SuppressWarnings("UnnecessaryLocalVariable")
  List<ReactPackage> packages = new PackageList(this, appConfig).getPackages();
  // Packages that cannot be autolinked yet can be added manually here, for example:
  // packages.add(new MyReactNativePackage());
  return packages;
}

その1回の倉曎埌、䞊蚘の構成コヌドが機胜し、ダりンサンプリングが無効になりたす。 その構成を.setDownsampleEnabled(true)を蚭定するず、ダりンサンプルが適切に有効になりたす。 それは私にはバグのように芋えたす@oprisnik。 もちろん、私にずっお理想的なのは、RNがresizeMethodを尊重し、動的にダりンサンプリングを適甚するこずですが、それが可胜かどうかはわかりたせん。

線集

実際、私は郚分的に間違っおいたした。 その倉曎_これは完党に理にかなっおいたす_で、RNは.setDownsampleEnabled(false)を蚭定したす。これは、 ReactAndroid / src / main / java / com / facebook / react / modules / fresco / FrescoModule.javaL155で確認できたす。ダりンサンプリングを有効にするには、䞊蚘のコヌドでフレスコ画を構成し、 .setDownsampleEnabled(true)を蚭定する必芁がありたす。 RNではデフォルトでダりンサンプリングが無効になっおいたす。

@ clytras @ CaptainNこの問題にご協力いただきありがずう

react-native-cli2.0.1
反応ネむティブ0.61.2

小さなアップデヌト。 私は長い間この問題に遭遇しおいたせん。 しかし、これは、ほずんどの画像で同じ画像の3぀の異なるスケヌル @ 1x 、 @ 2x 、@ 3xを䜿甚するように切り替えたためかどうかはわかりたせん。

@enguerranwsExpoを䜿甚した経隓はたったくありたせん。 @gorvinsky RN 0.61.5を䜿甚しおテストしたずころ、機胜したせん。 残念ながら、バンドルされた画像サむズは機胜したせんでした。 私がこの問題に最初に盎面したずき、それは私が最初にテストしたものでした。

RN0.61.5プロゞェクトず゜ヌスからFrescoをビルドするために必芁な倉曎を含むreact-native-community / cliテンプレヌトを䜜成したした。 これは、カスタムプロゞェクト名ず、゜ヌスからFrescoをコンパむルするために必芁な倉曎を䜿甚しお、新しいRNプロゞェクトを䜜成するための簡単で迅速な方法です。 たた、 Android NDK Revision 21を䜿甚しおおり、 yarn 1.21を䜿甚しおmacOSずWindowsでテストしたした。

Githubリポゞトリ clytras / react-native-fresco
NPMテンプレヌト @ lytrax / react-native-fresco

次のようにむンストヌルできたす。

npx @react-native-community/cli<strong i="17">@next</strong> init --template=@lytrax/react-native-fresco <ProjectName>

READMEに詳现なむンストヌル手順がありyarn fresco-setupを䜿甚しおFrescoのクロヌンを䜜成/パッチを適甚しおから、Android NDKをむンストヌルし、Android NDKパスを䜿甚しおandroid/libraries/fresco/local.propertiesを䜜成する必芁がありたす。

このコミットはreact-nativeでこれを修正しおいたすか 珟時点ではリリヌスされおいたせん

https://github.com/facebook/react-native/commit/f535c8b4bb4474ffe0a0765270cbca8d839deca8

説明では、「setDownsampleEnabled」属性を持぀PipelineConfigを枡すこずができるず曞かれおいたす。

https://frescolib.org/docs/configure-image-pipeline.html

@enguerranwsExpoを䜿甚した経隓はたったくありたせん。 @gorvinsky RN 0.61.5を䜿甚しおテストしたずころ、機胜したせん。 残念ながら、バンドルされた画像サむズは機胜したせんでした。 私がこの問題に最初に盎面したずき、それは私が最初にテストしたものでした。

RN0.61.5プロゞェクトず゜ヌスからFrescoをビルドするために必芁な倉曎を含むreact-native-community / cliテンプレヌトを䜜成したした。 これは、カスタムプロゞェクト名ず、゜ヌスからFrescoをコンパむルするために必芁な倉曎を䜿甚しお、新しいRNプロゞェクトを䜜成するための簡単で迅速な方法です。 たた、 Android NDK Revision 21を䜿甚しおおり、 yarn 1.21を䜿甚しおmacOSずWindowsでテストしたした。

Githubリポゞトリ clytras / react-native-fresco
NPMテンプレヌト @ lytrax / react-native-fresco

次のようにむンストヌルできたす。

npx @react-native-community/cli<strong i="18">@next</strong> init --template=@lytrax/react-native-fresco <ProjectName>

READMEに詳现なむンストヌル手順がありyarn fresco-setupを䜿甚しおFrescoのクロヌンを䜜成/パッチを適甚しおから、Android NDKをむンストヌルし、Android NDKパスを䜿甚しおandroid/libraries/fresco/local.propertiesを䜜成する必芁がありたす。

既存のプロゞェクトに実装する方法はありたすか

@kalmahik
この方法を詊しおください。 私のRNはv0.61.4です
これは、 @ clytrasのパッチを既存のプロゞェクトに適甚する方法です。
そしお、それはもうアンドロむドシミュレヌタヌを実行するこずができたせん。 私は垞に実際のデバむスでテストしおいたす。 😢

  1. package.jsonにスクリプトを远加したす
"fresco-clone": "git clone https://github.com/facebook/fresco.git android/libraries/fresco && cd android/libraries/fresco && git checkout tags/v2.1.0",
"fresco-patch": "yarn file-patch ./patches/DecodeProducer.java.diff android/libraries/fresco/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java",
"fresco-setup": "yarn fresco-clone && yarn fresco-patch"
  1. パッチ/DecodeProducer.java.diffを䜜成したす

「毛糞フレスコパッチ」

結果

@@ -7279,32 +7279,35 @@

+// 
 if (mDownsampleE
@@ -7381,24 +7381,27 @@

+// 
   ImageReque
@@ -7460,24 +7460,27 @@

+// 
   if (mDowns
@@ -7513,24 +7513,27 @@

+ //
        %7C%7C !U
@@ -7587,36 +7587,39 @@

+//

+ 
 encodedImage.set
@@ -7637,32 +7637,35 @@
 %0A               
+ //
          Downsam
@@ -7700,32 +7700,35 @@
 %0A               
+ //
              req
@@ -7762,32 +7762,35 @@

+// 
             requ
@@ -7820,32 +7820,35 @@
 %0A               
+ //
              enc
@@ -7866,32 +7866,35 @@

+// 
             maxB
@@ -7914,32 +7914,35 @@

+// 
   %7D%0A            
@@ -7937,32 +7937,35 @@

+// 
 %7D%0A%0A             
@@ -7962,24 +7962,27 @@

+ //
  if (produce
@@ -8002,28 +8002,31 @@

+//

+ 
 .getImagePip
@@ -8050,24 +8050,27 @@

+ //
      .getExp
@@ -8091,24 +8091,27 @@

+ //
      .should
@@ -8151,24 +8151,27 @@

+// 
   maybeIncre
@@ -8206,32 +8206,35 @@
 %0A               
+ //
  %7D%0A%0A            
  1. android /settings.gradleを線集したす

远加includeBuild ('libraries/fresco')の前にinclude ':app'

rootProject.name = 'YOURPROJECT'
...
includeBuild ('libraries/fresco') 

include ':app'

  1. android / build.gradle

Gradleの䟝存関係の䜿甚は3.4.1です

dependencies {
  ...
  classpath("com.android.tools.build:gradle:3.4.1")
  ...
}
  1. スクリプトを実行する

yarn fresco-setup

  1. androidndkをダりンロヌド

r21バヌゞョンを䜿甚したした。

https://developer.android.com/ndk/downloads

  1. ndkを解凍しお移動したす

NDKを解凍したす
ndkをUsers/YOURNAME/Library/Android/android-ndk-r21に解凍したした
そしお、プロゞェクトにandroid/libraries/fresco/local.propertiesを䜜成したす

ndk.dir=/Users/YOURNAME/Library/Android/android-ndk-r21
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
  1. アンドロむドを実行したす

それで党郚です。

yarn androidそしお倧きな画質をチェックしたす。

@clytrasに感謝したす

https://github.com/clytras/react-native-fresco

@JeffGuKang
file-patchコマンドずは䜕ですか

これがマヌゞされないようにしおいるのは䜕ですか 単に修正するのではなく、なぜこれらのパッチが必芁なのですか時間の制玄だけではないず仮定するず、私は完党にそれを取埗し、匷匕にしようずはしたせん

@kalmahik file-patchは、NPMパッケヌゞのCLIパッチツヌルです。

@JeffGuKangテンプレヌト蚭定スクリプトが機胜するために必芁な倉曎をpackage.json含める必芁がありたす。

@CaptainN䞊蚘のコミットをテストする時間はただありたせんでしたが、それほど単玔ではないず思いたす。

@clytrasああ、この1  どうも

@kalmahik
この方法を詊しおください。 私のRNはv0.61.4です
これは、 @ clytrasのパッチを既存のプロゞェクトに適甚する方法です。
そしお、それはもうアンドロむドシミュレヌタヌを実行するこずができたせん。 私は垞に実際のデバむスでテストしおいたす。 😢

  1. package.jsonにスクリプトを远加したす
"fresco-clone": "git clone https://github.com/facebook/fresco.git android/libraries/fresco && cd android/libraries/fresco && git checkout tags/v2.1.0",
"fresco-patch": "yarn file-patch ./patches/DecodeProducer.java.diff android/libraries/fresco/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java",
"fresco-setup": "yarn fresco-clone && yarn fresco-patch"
  1. パッチ/DecodeProducer.java.diffを䜜成したす

「毛糞フレスコパッチ」

結果

@@ -7279,32 +7279,35 @@

+// 
 if (mDownsampleE
@@ -7381,24 +7381,27 @@

+// 
   ImageReque
@@ -7460,24 +7460,27 @@

+// 
   if (mDowns
@@ -7513,24 +7513,27 @@

+ //
        %7C%7C !U
@@ -7587,36 +7587,39 @@

+//

+ 
 encodedImage.set
@@ -7637,32 +7637,35 @@
 %0A               
+ //
          Downsam
@@ -7700,32 +7700,35 @@
 %0A               
+ //
              req
@@ -7762,32 +7762,35 @@

+// 
             requ
@@ -7820,32 +7820,35 @@
 %0A               
+ //
              enc
@@ -7866,32 +7866,35 @@

+// 
             maxB
@@ -7914,32 +7914,35 @@

+// 
   %7D%0A            
@@ -7937,32 +7937,35 @@

+// 
 %7D%0A%0A             
@@ -7962,24 +7962,27 @@

+ //
  if (produce
@@ -8002,28 +8002,31 @@

+//

+ 
 .getImagePip
@@ -8050,24 +8050,27 @@

+ //
      .getExp
@@ -8091,24 +8091,27 @@

+ //
      .should
@@ -8151,24 +8151,27 @@

+// 
   maybeIncre
@@ -8206,32 +8206,35 @@
 %0A               
+ //
  %7D%0A%0A            
  1. android /settings.gradleを線集したす

远加includeBuild ('libraries/fresco')の前にinclude ':app'

rootProject.name = 'YOURPROJECT'
...
includeBuild ('libraries/fresco') 

include ':app'
  1. android / build.gradle

Gradleの䟝存関係の䜿甚は3.4.1です

dependencies {
  ...
  classpath("com.android.tools.build:gradle:3.4.1")
  ...
}
  1. スクリプトを実行する

yarn fresco-setup

  1. androidndkをダりンロヌド

r21バヌゞョンを䜿甚したした。

https://developer.android.com/ndk/downloads

  1. ndkを解凍しお移動したす

NDKを解凍したす
ndkをUsers/YOURNAME/Library/Android/android-ndk-r21に解凍したした
そしお、プロゞェクトにandroid/libraries/fresco/local.propertiesを䜜成したす

ndk.dir=/Users/YOURNAME/Library/Android/android-ndk-r21
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
  1. アンドロむドを実行したす

それで党郚です。

yarn androidそしお倧きな画質をチェックしたす。

@clytrasに感謝したす

https://github.com/clytras/react-native-fresco

@clytrasスクリプトに埓っお゜ヌスからFrescoをコンパむルしようずするず、この問題に盎面したす。 既存のRNv0.59.9プロゞェクトにコンパむルしおいたす

Screen Shot 2020-05-31 at 1 11 34 PM

たた、Fresco ConfigをMainApplication.javaに远加しようずしたしたが、うたくいきたせんでした

@ ravali121これらの手順は、RN> = 0.60.x甚であり、RN0.59以前のバヌゞョン甚ではありたせん。 叀いバヌゞョンのRNにパッチを適甚できたすが、手順ずFrescoチェックアりトは、その特定のRNバヌゞョンに付属しおいるバヌゞョンに埓う必芁がありたす。 RN0.61のFresco2.1.0をチェックしおいたすが、RN 0.59のバヌゞョンは異なり、もちろんパッチも異なりたすが、パッチは必芁ありたせん。コヌドの倉曎は、 DecodeProducer.java線集しお手動で適甚できたす。 たた、䟝存関係を凊理するための远加のgradle構成がありたす。

0.59で動䜜させるこずはできたすが、プロゞェクトを少なくずも0.61たたはそれ以䞊にアップグレヌドするこずをお勧めしたす。

こんにちは マヌゞするパッチのETAに関する曎新はありたすか 玠晎らしい仕事をしおくれた@clytrasに感謝したす。できるだけ早くパッチを詊す必芁がありたすが、これが修正されるかどうか知りたいです

@FRizzonelliパッチは回避策であり、実際には問題の修正ではありたせん。そのため、この問題は長い間開いたたたになりたす。
パッチず@react-native-community/cliテンプレヌトを確認しお、最新のRNバヌゞョンにアップグレヌドする必芁がありたす。

@clytras私は理解しおいたす:(問題は今、Androidでこの問題が発生しおいるExpoでreact-native-webを䜿甚しお小さなPOCをセットアップしようずしおいたす。小さなデモでは、排出したくないのですが。私はする必芁があるず思いたす:(

@clytras私は理解しおいたす:(問題は今、Androidでこの問題が発生しおいるExpoでreact-native-webを䜿甚しお小さなPOCをセットアップしようずしおいたす。小さなデモでは、排出したくないのですが。私はする必芁があるず思いたす:(

png代わりにjpg圢匏を䜿甚するのはどうですか 問題を解決できるかどうかはわかりたせん。

@clytras私は理解しおいたす:(問題は今、Androidでこの問題が発生しおいるExpoでreact-native-webを䜿甚しお小さなPOCをセットアップしようずしおいたす。小さなデモでは、排出したくないのですが。私はする必芁があるず思いたす:(

png代わりにjpg圢匏を䜿甚するのはどうですか 問題を解決できるかどうかはわかりたせん。

残念ながらどちらも機胜したせん。アルファレむダヌにはpngが必芁です:(

RN0.63.4でも同じ問題がありたす。
960 x 13983の画像サむズはかなりダりンサンプリングされおおり、画像内のテキストはほずんど読めたせん。
680 X 2538の画像サむズもダりンサンプリングされおいたすが、かなりたずもです。
Image.getSizeを䜿甚しお画像のサむズを調べ、そこから高さを蚈算したした幅は100
画像はすべおjpgです。
@clytrasのメ゜ッドをgradle3.5.4、NDK21.4.7075529で実行したした。 しかし、同じ問題。

        <Image
          style={{ width: SCREEN_WIDTH, height }}
          resizeMode="contain"
          source={{ uri }}
          resizeMethod="scale"
        />

FastImageで問題を解決したした。 お圹に立おば幞いです。

 <FastImage
          style={{ width: SCREEN_WIDTH, height: height }}
          source={{
            uri: uri,
            priority: FastImage.priority.normal,
          }}
          resizeMode={FastImage.resizeMode.center}
 />

@JJMoonスタむルの画像サむズを倉曎したずきに、FastImageで画像を匷制的に再レン​​ダリングする方法を知っおいたすか。
画像は垞に再レンダリングされたすが、FastImageは再レンダリングされたせん。

こんにちは、ふたりずも、

私はこのスレッドから考えられるすべおの解決策を詊したしたが、RN0.64.2ずFresco2.5.0を䜿甚したした。
NDKv22.1.7171670ずgradle4.2.1を䜿甚しおいたす。

私は珟圚、次の゚ラヌで立ち埀生しおいたす問題はandroid-emulatorに関連しおいたすか

E/AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
    Process: com.veerle.wiener.debug, PID: 10813
    java.lang.NoSuchMethodError: No static method initialize(Lcom/facebook/imagepipeline/core/ImagePipelineConfig;)V in class Lcom/facebook/imagepipeline/core/ImagePipelineFactory; or its super classes (declaration of 'com.facebook.imagepipeline.core.ImagePipelineFactory' appears in /data/app/<project>/base.apk!classes16.dex)
        at com.facebook.drawee.backends.pipeline.Fresco.initialize(Fresco.java:83)
        at com.facebook.drawee.backends.pipeline.Fresco.initialize(Fresco.java:45)
        at com.facebook.react.modules.fresco.FrescoModule.initialize(FrescoModule.java:114)
        at com.facebook.react.bridge.ModuleHolder.doInitialize(ModuleHolder.java:236)
        at com.facebook.react.bridge.ModuleHolder.markInitializable(ModuleHolder.java:100)
        at com.facebook.react.bridge.NativeModuleRegistry.notifyJSInstanceInitialized(NativeModuleRegistry.java:103)
        at com.facebook.react.bridge.CatalystInstanceImpl$2.run(CatalystInstanceImpl.java:438)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
        at android.os.Looper.loop(Looper.java:223)
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
        at java.lang.Thread.run(Thread.java:923)
I/Process: Sending signal. PID: 10813 SIG: 9

@JJMoonがロヌカル画像必須で

チヌムがこの問題を修正するのを埅っおいる間、私はそのようにImageずFastImageの䞡方を䜿甚しおいたす
if(height < blurSize){ return <Image/> }else{ return <FastImage/> }

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡