Autore Topic: Steganografare del testo in una immagine  (Letto 544 volte)

Offline Smith

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Ubuntu 13.04
Steganografare del testo in una immagine
« il: 09 Maggio 2013, 11:09:03 CEST »
0
Ciao ragazzi, sto cercando di steganografare (nascondere) un testo in una immagine presa dalla galleria.
Praticamente sto solo sostituendo il valore hsv[2] con ogni carattere del testo.
Ma quando vado a visualizzarlo, mi escono i valori originali, non sostituiti...
Quale può essere il problema?

Il codice è il seguente:

activity_main.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">

    <Button
       android:id="@+id/button1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Insert Image"
       android:onClick="insertImage" />

    <ImageButton
       android:id="@+id/imageButton1"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:src="@drawable/ic_launcher"
       android:onClick="selectOption" />

</LinearLayout>

MainActivity.java
Codice (Java): [Seleziona]
package com.example.android_1_10;

import java.io.InputStream;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends Activity {
        private Bitmap bitmap;
        private ImageView imageView;
        private static final String bitmapPath = "BITMAP_KEY";
        private Uri imagePath;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                Intent text = getIntent();
                String pkg = getPackageName();
                String hiddenText;
               
                if(text.getStringExtra(pkg + MyOptions.mess1) != null)
                {
                        if(!text.getStringExtra(pkg + MyOptions.mess1).toString().equals("viewTextInImage"))
                        {
                                Log.v("LOAD1","LOAD1");
                                imagePath = LoadImageButton1Preferences();
                                hiddenText = text.getStringExtra(pkg + MyOptions.mess1).toString();
                                hideText(hiddenText);
                        }
                        else
                        {
                                Log.v("LOAD2","LOAD2");
                                imagePath = LoadImageButton1Preferences();
                                viewHiddenText();
                        }
                }              
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }
       
        @Override
        protected void onPause() {
                // TODO Auto-generated method stub
                super.onPause();
                if(bitmap != null)
                {
                        saveImageButton1Preferences(imagePath);
                }
        }
       
        public void insertImage(View view)
        {
                Intent image = new Intent();
                image.addCategory(Intent.CATEGORY_OPENABLE);
                image.setAction(Intent.ACTION_GET_CONTENT);
                image.setType("image/*");
                startActivityForResult(image, 1);
        }
       
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                // TODO Auto-generated method stub
                super.onActivityResult(requestCode, resultCode, data);
                imageView = (ImageView) findViewById(R.id.imageButton1);
               
                if(requestCode == 1 && resultCode == Activity.RESULT_OK)
                {
                        try
                        {
                                if(bitmap != null)
                                {
                                        bitmap.recycle();
                                }
                                InputStream stream = getContentResolver().openInputStream(data.getData());
                                bitmap = BitmapFactory.decodeStream(stream);
                                imageView.setImageBitmap(bitmap);
                                imagePath = data.getData();
                        }
                        catch (Exception e)
                        {
                                e.printStackTrace();
                        }
                }
        }
       
        public void selectOption(View view)
        {
                imageView = (ImageView) findViewById(R.id.imageButton1);
                if(imageView == null)
                {
                        dialogMainActivity("Scegliere una immagine dalla galleria!!");
                }
                else
                {
                        Intent options = new Intent(this, MyOptions.class);
                        startActivity(options);
                }
        }
       
        public void dialogMainActivity(String message)
        {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage(message);
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                       
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                dialog.dismiss();
                        }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
        }
       
        private void saveImageButton1Preferences(Uri imgPath)
        {
                if(bitmap != null)
                {
                        SharedPreferences myPref = getPreferences(MODE_PRIVATE);
                        SharedPreferences.Editor editor = myPref.edit();
                        editor.putString(bitmapPath, imgPath.toString());
                        editor.commit();
                }
        }
       
        private Uri LoadImageButton1Preferences()
        {
                String imgPath;
                imageView = (ImageView) findViewById(R.id.imageButton1);
                SharedPreferences myPref = getPreferences(MODE_PRIVATE);
                imgPath = myPref.getString(bitmapPath, "");
                imageView.setImageURI(Uri.parse(imgPath));
                return Uri.parse(imgPath);
        }
       
        public void hideText(String hiddenText)
        {
                // Rivedere dal segnalibro su firefox
                Bitmap bm;
                int size, pixels[], offset = 0, stride, x = 0, y = 0, i, k = 0, onePixel;
                float hsv[] = new float[3];
               
                try
                {
                        bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imagePath);
                        bm = bitmap.copy(Bitmap.Config.ARGB_8888, true);
                        //imagePath è aggiornato
                        size = bm.getWidth() * bm.getHeight();
                        pixels = new int[size];
                        stride = bm.getWidth();
                       
                        bm.getPixels(pixels, offset, stride, x, y, bm.getWidth(), bm.getHeight());
                       
                        for(i=0; i < size;i++)
                        {
                                onePixel = pixels[i];
                                Color.colorToHSV(onePixel, hsv);
                                hsv[2] = hiddenText.charAt(k);                 
                                pixels[i] = Color.HSVToColor(hsv);
                                k++;
                                if(k >= hiddenText.length())
                                {
                                        i = size;
                                }
                        }
                       
                        bm.setPixels(pixels, offset, stride, x, y, bm.getWidth(), bm.getHeight());                                             
                       
                        imageView = (ImageView) findViewById(R.id.imageButton1);
                        bitmap = bm.copy(Bitmap.Config.ARGB_8888, false);
                        imageView.setImageBitmap(bitmap);
                        String path = Images.Media.insertImage(this.getContentResolver(), bitmap, "Title", null);
                        imagePath = Uri.parse(path);
                        Log.v("path",imagePath.toString());
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
        }
       
        public void viewHiddenText()
        {
                int pixels[], offset = 0, stride, x = 0, y = 0, i, size, onePixel, k=0;
                float hsv[] = new float[3];
                String seenText = null;
       
                try
                {
                        bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imagePath);
                        stride = bitmap.getWidth();
                        size = bitmap.getWidth()*bitmap.getHeight();
                        pixels = new int[size];
                       
                        bitmap.getPixels(pixels, offset, stride, x, y, bitmap.getWidth(), bitmap.getHeight());
                       
                        for(i=0; i < size; i++)
                        {
                                onePixel = pixels[i];
                                Color.colorToHSV(onePixel, hsv);
                                seenText = seenText + hsv[2];
                                pixels[i] = Color.HSVToColor(hsv);
                                k++;
                                if(k >= 4)
                                {
                                        i = size;
                                }
                        }                      
                        dialogMainActivity(seenText);
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
        }
}

MyOptions.java
Codice (Java): [Seleziona]
package com.example.android_1_10;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

public class MyOptions extends Activity {
       
        public final static String mess1 = "Testo da Steganografare";

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_my_options);
                // Show the Up button in the action bar.
                setupActionBar();
        }

        /**
         * Set up the {@link android.app.ActionBar}.
         */

        private void setupActionBar() {

                getActionBar().setDisplayHomeAsUpEnabled(true);

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.my_options, menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                        // This ID represents the Home or Up button. In the case of this
                        // activity, the Up button is shown. Use NavUtils to allow users
                        // to navigate up one level in the application structure. For
                        // more details, see the Navigation pattern on Android Design:
                        //
                        // [url=http://developer.android.com/design/patterns/navigation.html#up-vs-back]Navigation with Back and Up | Android Developers[/url]
                        //
                        NavUtils.navigateUpFromSameTask(this);
                        return true;
                }
                return super.onOptionsItemSelected(item);
        }
       
        public void insertText(View view)
        {              
                dialogMyOptionInsertActivity();
        }
       
        public void dialogMyOptionInsertActivity()
        {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("STEGANOGRAFIA");
                builder.setMessage("Scrivi il testo da steganografare nell'immagine");
               
                final EditText editText = new EditText(this);
                builder.setView(editText);
               
                builder.setPositiveButton("INSERT", new DialogInterface.OnClickListener() {
                       
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                Intent insert = new Intent(MyOptions.this, MainActivity.class);
                                String pkg = getPackageName();
                                String text = editText.getEditableText().toString();
                                insert.putExtra(pkg + MyOptions.mess1, text);
                                startActivity(insert);
                                dialog.dismiss();
                        }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
        }
       
        public void viewText(View view)
        {
                Intent vText = new Intent(this, MainActivity.class);
                String pkg = getPackageName();
                String text = "viewTextInImage";
                vText.putExtra(pkg + mess1, text);
                startActivity(vText);
        }
}

activity_my_options.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MyOptions" >

    <Button
       android:id="@+id/button1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Insert Text"
       android:onClick="insertText" />

    <Button
       android:id="@+id/button2"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="View Text"
       android:onClick="viewText" />

</LinearLayout>