2017-01-28 1 views
1

Ich versuche, die Bytes von Android 192x192ic_launcher.png (die mipmap-xxxhdpi Version) zu lesen. HierWarum unterscheiden sich meine PNG-Bytes?

ist, was ich tue:

Drawable drawable = ResourcesCompat.getDrawableForDensity 
      (getResources(), R.mipmap.ic_launcher, 640, getTheme()); 

Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 

byte[] pngBytes = stream.toByteArray(); 

Log.d("TEST", "" + pngBytes[37]); 

Ich vergleiche die Ergebnisse mit einem Hex-Editor auf die Datei app\src\main\res\mipmap-xxxhdpi\ic_launcher.png.

Aus irgendeinem Grund ist das Byte bei pngBytes[37]anders als das tatsächliche Byte. Die vorhergehenden Bytes sind identisch.

Was kann so etwas verursachen?

Antwort

0

Aus irgendeinem Grund ist das Byte bei pngBytes [37] anders als das tatsächliche Byte.

Nun, sicher. Höchstwahrscheinlich wird es einige Unterschiede geben. Es gibt keine Anforderung für compress() Ihnen eine identische PNG-Datei zu geben, als das, was Sie begann mit, wie es sein kann:

  • verschiedene Komprimierungsstufen
  • unterschiedliche Farbpalette (zB Build-Prozess pngquant -Stil Techniken anwenden könnte auf Ihre Ressource)
  • verschiedene Pixelformate (im Vergleich zu einfachen ARGB indexiert)
  • und so weiter
+0

Dank. Wie kann ich die tatsächlichen Bytes erhalten? –

+0

@UFCInsider: Verschieben Sie das PNG in 'res/raw /' und verwenden Sie 'openRawResource()' auf einem 'Resources' Objekt. Oder verschieben Sie das PNG in 'assets /' und verwenden Sie 'open()' auf einem 'AssetManager'. Beides wird Ihnen einen 'InputStream' für die rohe Ressource oder den Inhalt geben, und diese Dateien sollten nicht als Teil des Build-Prozesses modifiziert werden. – CommonsWare

+0

Gibt es eine Möglichkeit, die tatsächlichen Bytes programmgesteuert zu erhalten? Ich möchte das PNG –

Verwandte Themen