Base64 кодирование и просмотр изображения - PullRequest
2 голосов
/ 27 декабря 2011

В настоящее время я пытаюсь сделать следующее:

Сделайте снимок, сожмите его в PNG, закройте с помощью Base64 и отправьте в базу данных через PHP.Это все работает как шарм.Я также могу декодировать строку Base64 и отлично отображать фотографию.

Однако, похоже, проблемы заключаются в том, что при просмотре изображения в браузере, оно не совпадает с размером (или, по крайней мере,Я думаю).

Это изображение, которое я взял, закодировано и отображено в браузере: enter image description here

Независимо от телефона (также протестировано на Galaxy SII), проблема все еще остается.Ребята, вы знаете, что может происходить?Вот некоторые идеи, которые у меня есть, но я не уверен ... 1. Слишком сильное сжатие изображения - или когда оно сжимается, оно что-то меняет 2. Кодирование / декодирование Base64 портит фотографию и не отображает ее правильно 3. Когда я размещаюизображение в представлении изображения изменяет размер.

Опять же, кажется, что полное изображение не передается, потому что нет никакого изображения, даже если изображение Galaxy sII выглядит таким маленьким.

Вот код, который я использую: Android:

// CONVERT:
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        picture.compress(Bitmap.CompressFormat.PNG, 100, bao);
        Log.d(TAG, "AFTER. Height: " + picture.getHeight() + " Width: " + picture.getWidth());
        final byte[] ba = bao.toByteArray();

        //encode to string
        String photoTest = Base64.encodeToString(ba, Base64.DEFAULT);

//Camera on activity for result - save it as a bmp and place in imageview
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_PIC_REQUEST) {
            // do something
        }

        if (resultCode == Activity.RESULT_OK) {
            Log.d(TAG, "result ok");

            Bundle b = data.getExtras();
            picture = (Bitmap) b.get("data");
            imageView.setImageBitmap(picture);
        }
    }

ПРОСМОТР ИЗОБРАЖЕНИЯ В ANDROID:

<ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/icon"/>

PHP:

$image = base64_decode($_POST['image_data']);

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

Как я это решил: Оказывается, что при сохранении фотографии, как я делал выше, она возвращает только уменьшенную версию фотографии, а не фотографию в натуральную величину. Мне пришлось добавить EXTRA_OUTPUT в мои намерения, сохранить его на SD-карту, а затем сжать. Если у кого-то есть подобные проблемы, пожалуйста, напишите мне.

1 голос
/ 27 декабря 2011

Base64 оставляет двоичные данные совершенно нетронутыми, он не делает уловок изменения размера. Я предполагаю, что проблема в строке picture.compress(Bitmap.CompressFormat.PNG, 100, bao);, но это не совсем моя область.

0 голосов
/ 30 декабря 2015

У меня была такая же проблема, вот как я решил свою проблему, этот метод откроет приложение камеры по умолчанию, сохранит изображение во временную папку и преобразует его в Base64 / ByteArray.

1 - НажмитеСлушатель, чтобы открыть приложение камеры

// My ImageButton click Listener
ibt_foto.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        String tempDir = Environment.getExternalStorageDirectory() + "/folder/";
        String path = Environment.getExternalStorageDirectory() + "/folder/photo1.jpg";
        prepareDirectory();
        File file = new File(path);
        Uri outputFileUri = Uri.fromFile(file);
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
});

2 - Создание папки

private boolean prepareDirectory() {
    try {
        if (makedirs()) {
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show();
        return false;
    }
}

private boolean makedirs() {

    File tempdir = new File(tempDir);
    if (!tempdir.exists()) {
        tempdir.mkdirs();
    }

    /*
    // Use this if you want to delete older files
    if (tempdir.isDirectory()) {
        File[] files = tempdir.listFiles();
        for (File file : files) {
            if (!file.delete()) {
                System.out.println("Failed to delete " + file);
            }
        }
    }
    */

    return (tempdir.isDirectory());
}

3 - Обработка результатов из приложения камеры

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    System.gc(); 

    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            try {

                // Get image
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 3;
                Bitmap imageBitmap = BitmapFactory.decodeFile(path, options);

                // Converting to ByteArray and Base64
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                boolean validaCompressao = imageBitmap.compress(Bitmap.CompressFormat.JPEG, 75, outputStream);
                byte[] fotoBinario = outputStream.toByteArray();

                String encodedImage = Base64.encodeToString(fotoBinario, Base64.DEFAULT);

                // setting image to my ImageButton
                ibt_foto.setImageBitmap(imageBitmap);

            } catch (Exception e) {
                Toast.makeText(this, "Picture Not taken",Toast.LENGTH_LONG).show();e.printStackTrace();
            }
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "Picture was not taken 1 ", Toast.LENGTH_SHORT);
        } else {
            Toast.makeText(this, "Picture was not taken 2 ", Toast.LENGTH_SHORT);
        }
    }
}
...