2016-07-15 24 views
-1

Ich habe hier ein ziemliches Problem.Ich bekomme nach dem Lesen und Schreiben des Bildes einen anderen Pixelwert

Wenn ich Bild lesen und dann speichern, bekomme ich das gleiche Bild. Aber wenn ich den Pixelwert öffne, ist der Wert jedes Pixels etwas anders (größer oder kleiner um 10 Einheiten).

Warum hat sich das Pixel geändert? Ich lese nur das Bild, dann speichere es, ich mache keine Änderungen am Pixel. Ich erstelle es mit dem Format RGB und speichern Sie als PNG mit ByteArrayOutputStream Methode.

private void onCaptureImageResult(Intent data) { 
    Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes); 

    File destination = new File(Environment.getExternalStorageDirectory(), 
      System.currentTimeMillis() + ".jpg"); 

    FileOutputStream fo; 
    try { 
     destination.createNewFile(); 
     fo = new FileOutputStream(destination); 
     fo.write(bytes.toByteArray()); 
     fo.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    ivImage.setImageBitmap(thumbnail); 
} 

private void onSelectFromGalleryResult(Intent data) { 

     Bitmap bm=null; 
     if (data != null) { 
      try { 
       bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     bmp = bm; 
    } 

public void save(View view){ 
    operation= Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(),bmp.getConfig()); 
    int size = bmp.getRowBytes() * bmp.getHeight(); 
    bytearrayoutputstream = new ByteArrayOutputStream(); 
    int[] gambarR = new int[size]; 
    int[] gambarG = new int[size]; 
    int[] gambarB = new int[size]; 
    int[] gambarA = new int[size]; 
    int k = 0; 

    for(int i=0; i<bmp.getWidth(); i++){ 
     for(int j=0; j<bmp.getHeight(); j++){ 
      int p = bmp.getPixel(i, j); 
      gambarR[k] = Color.red(p); 
      gambarG[k] = Color.green(p); 
      gambarB[k] = Color.blue(p); 
      gambarA[k] = Color.alpha(p); 
      k++; 
     } 
    } 
    int l = 0; 

    for(int i = 0; i<bmp.getWidth(); i++){ 
     for(int j = 0; j<bmp.getHeight();j++){ 
      operation.setPixel(i, j, Color.rgb(gambarR[l], gambarG[l], gambarB[l])); 
      l++; 
     } 
    } 
    String fileName = "_hasil.bmp"; 
    Long tsLong = System.currentTimeMillis()/1000; 
    String ts = tsLong.toString(); 
    String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    File gambar = new File(baseDir + File.separator + ts + fileName); 
    try 
    { 
     gambar.createNewFile(); 
     fileoutputstream = new FileOutputStream(gambar); 
     fileoutputstream.write(bytearrayoutputstream.toByteArray()); 
     fileoutputstream.close(); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 

    } 

    ivImage.setImageBitmap(operation); 
} 

Ich werde Ihnen den Unterschied zwischen dem Bild zeigen. Ich lese nur und speichere und ändere das Pixel nicht. Ich brauche das Pixel nicht geändert, wenn ich es zurückspare.

this is the difference between the pixel of the image.

+0

Glaubst du wirklich, dass wir das wissen? Du solltest deinen Code natürlich veröffentlichen. – greenapps

+0

@greenapps Entschuldigung, ich habe meinen Code jetzt hochgeladen. und ich gebe die ss des Bildpixels. hilf mir bitte, danke – siahaanj

+0

Es gibt keinen Code, der ein Bild liest. Und Sie zeigen vor dem Speichern nicht, was Sie in den Bytearray-Ausgabestream geschrieben haben. Bitte senden Sie einen vollständigen reproduzierbaren Code, den wir testen können. Sie zeigen auch nicht, wie Sie den Wert der Pixel vorher und nachher bestimmen. – greenapps

Antwort

1

Wie andere bemerkt haben, viel von dem Code, den Sie erscheint gepostet nicht viel Sinnvolles zu tun, was darauf hinweist, dass Sie entweder nicht die Dokumentation gelesen haben, oder haben durch das Problem gründlich nicht gedacht.

Das spezielle Problem scheint jedoch zu sein, dass Sie Ihr Bild in einem verlustbehafteten Komprimierungsformat (JPEG) in diesem Fall in einer Qualität von 90% speichern. "Lossy" bedeutet, dass Sie per Definition niemals die Bitmap erhalten, die Sie vor der Komprimierung hatten. Selbst wenn Sie die JPEG-Qualität auf 100% einstellen, erhalten Sie wahrscheinlich nicht die gleiche Bitmap wie vor der Komprimierung.

Wenn Sie beim Lesen der Datei genau dieselben Werte wünschen, müssen Sie ein verlustfreies Format wie PNG oder BMP schreiben.

+0

Ich habe nur diesen Code, um das Bild zu lesen und zurückzuschreiben. oder vielleicht kannst du mir etwas Code geben, um Bild in Android zu lesen und zu schreiben? Ich brauche es so sehr, ich brauche einen stabilen Pixelwert, dann kann ich das Bild verschlüsseln und entschlüsseln. pls help me – siahaanj

+0

Verwenden Sie CompressFormat.PNG anstelle von CompressFormat.JPG Ein Beispiel finden Sie unter http://stackoverflow.com/questions/8417034/how-to-make-bitmap-compress-without-change-the-bitmap-size – GreyBeardedGeek