Сохранение растрового изображения в место

голоса
395

Я работаю на функции, чтобы загрузить изображение с веб-сервера, отображать его на экране, и если пользователь хочет сохранить изображение, сохраните его на SD-карте в определенной папке. Есть простой способ, чтобы растровое изображение и просто сохранить его на SD-карте в папке моего выбора?

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

Другой вариант у меня есть использовать Mediastore:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + .jpg Card Image, barcodeNumber + .jpg Card Image);

Который работает нормально, чтобы сохранить на SD-карту, но не позволяет вам настроить папку.

Задан 16/03/2009 в 04:26
источник пользователем
На других языках...                            


16 ответов

голоса
810

FileOutputStream out = null;
try {
    out = new FileOutputStream(filename);
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (out != null) {
            out.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Ответил 23/03/2009 d 12:22
источник пользователем

голоса
121

Вы должны использовать Bitmap.compress()метод для сохранения растрового изображения в виде файла. Это будет сжимать (если используемый формат позволяет это) снимок и вставьте его в OutputStream.

Ниже приведен пример Bitmap экземпляра , полученного через getImageBitmap(myurl)которые могут быть сжаты в JPEG с коэффициентом сжатия 85%:

// Assume block needs to be inside a Try/Catch block.
String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
Integer counter = 0;
File file = new File(path, "FitnessGirl"+counter+".jpg"); // the File to save , append increasing numeric counter to prevent files from getting overwritten.
fOut = new FileOutputStream(file);

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate
fOut.flush(); // Not really required
fOut.close(); // do not forget to close the stream

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
Ответил 10/06/2010 d 11:42
источник пользователем

голоса
34
outStream = new FileOutputStream(file);

выбросит исключение без разрешения в AndroidManifest.xml (по крайней мере, в OS2.2):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Ответил 14/10/2011 d 23:57
источник пользователем

голоса
19

Внутри onActivityResult:

String filename = "pippo.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

Bitmap bitmap = (Bitmap)data.getExtras().get("data");
try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}
Ответил 25/01/2012 d 17:19
источник пользователем

голоса
13

Некоторые форматы, как PNG, который является без потерь, будут игнорировать настройки качества.

Ответил 09/12/2009 d 14:53
источник пользователем

голоса
8
Bitmap bbicon;

bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10);
//ByteArrayOutputStream baosicon = new ByteArrayOutputStream();
//bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon);
//bicon=baosicon.toByteArray();

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
OutputStream outStream = null;
File file = new File(extStorageDirectory, "er.PNG");
try {
    outStream = new FileOutputStream(file);
    bbicon.compress(Bitmap.CompressFormat.PNG, 100, outStream);
    outStream.flush();
    outStream.close();
} catch(Exception e) {

}
Ответил 22/06/2011 d 10:25
источник пользователем

голоса
8

Почему бы не назвать Bitmap.compressметод с 100 (который звучит , как это без потерь)?

Ответил 16/03/2009 d 05:10
источник пользователем

голоса
6

Вот пример кода для сохранения растрового изображения в файл:

public static File savebitmap(Bitmap bmp) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 60, bytes);
    File f = new File(Environment.getExternalStorageDirectory()
            + File.separator + "testimage.jpg");
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
    fo.close();
    return f;
}

Теперь вызвать эту функцию для сохранения растрового изображения во внутреннюю память.

File newfile = savebitmap(bitmap);

Я надеюсь, что это поможет. Счастливый codeing жизнь.

Ответил 02/04/2016 d 09:41
источник пользователем

голоса
6

Я хотел бы также, чтобы сохранить изображение. Но моя проблема (?), Что я хочу, чтобы сохранить его от растрового изображения ив нарисовали.

Я сделал это так:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.save_sign:      

                myView.save();
                break;

            }
            return false;    

    }

public void save() {
            String filename;
            Date date = new Date(0);
            SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss");
            filename =  sdf.format(date);

            try{
                 String path = Environment.getExternalStorageDirectory().toString();
                 OutputStream fOut = null;
                 File file = new File(path, "/DCIM/Signatures/"+filename+".jpg");
                 fOut = new FileOutputStream(file);

                 mBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                 fOut.flush();
                 fOut.close();

                 MediaStore.Images.Media.insertImage(getContentResolver()
                 ,file.getAbsolutePath(),file.getName(),file.getName());

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

 }
Ответил 18/11/2010 d 10:26
источник пользователем

голоса
5

Способ я нашел, чтобы отправить PNG и прозрачность.

String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/CustomDir";
File dir = new File(file_path);
if(!dir.exists())
  dir.mkdirs();

String format = new SimpleDateFormat("yyyyMMddHHmmss",
       java.util.Locale.getDefault()).format(new Date());

File file = new File(dir, format + ".png");
FileOutputStream fOut;
try {
        fOut = new FileOutputStream(file);
        yourbitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
     } catch (Exception e) {
        e.printStackTrace();
 }

Uri uri = Uri.fromFile(file);     
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
intent.putExtra(Intent.EXTRA_STREAM, uri);

startActivity(Intent.createChooser(intent,"Sharing something")));
Ответил 08/04/2015 d 09:52
источник пользователем

голоса
1

Создание видео миниатюры для видео. Он может вернуть нулевое значение, если видео поврежден или формат не поддерживается.

private void makeVideoPreview() {
    Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND);
    saveImage(thumbnail);
}

Чтобы Сохранить растровое изображение в SDCard использовать следующий код

магазин изображение

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    } 
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

Для того, чтобы получить путь для хранения изображений

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this. 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files"); 

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    } 
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
        String mImageName="MI_"+ timeStamp +".jpg";
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
    return mediaFile;
} 
Ответил 28/06/2018 d 13:17
источник пользователем

голоса
1

Эй просто дать имя .bmp

Сделай это:

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
_bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.BMP" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
                        + File.separator + "**test.bmp**")

это будет звучать, что я просто дурачиться, но попробовать его, как только он будет спасаются в ОЦ foramt..Cheers

Ответил 22/01/2013 d 12:47
источник пользователем

голоса
0

После того, как Android 4.4 KitKat, и по состоянию на 2017 г. доля Android 4.4 и менее примерно 20% и снижается, это не возможно , чтобы сохранить на SD карту с помощью Fileкласса и getExternalStorageDirectory()метода. Этот метод возвращает вашу внутреннюю память устройства и сохранить видимые изображения для каждого приложения. Вы также можете сохранить изображения частных только для вашего приложения и должны быть удалены , когда пользователь удаляет приложение с openFileOutput()методом.

Начиная с Android 6.0, вы можете отформатировать карту памяти SD в качестве внутренней памяти, но только частное на устройство. (При форматировании SD автомобиля как внутренняя память, только устройство может получить доступ или увидеть его содержимое) Вы можете сохранить на эту SD карту с помощью другие ответы, но если вы хотите использовать съемную карту памяти SD, вы должны прочитать мой ответ ниже.

Вы должны использовать Storage Framework доступа , чтобы получить URI в папку onActivityResultметода деятельности , чтобы папка , выбранного пользователем, и добавить persistiable разрешения извлечь , чтобы иметь возможность получить доступ к папке после пользователь перезагружает устройство.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {

        // selectDirectory() invoked
        if (requestCode == REQUEST_FOLDER_ACCESS) {

            if (data.getData() != null) {
                Uri treeUri = data.getData();
                tvSAF.setText("Dir: " + data.getData().toString());
                currentFolder = treeUri.toString();
                saveCurrentFolderToPrefs();

                // grantUriPermission(getPackageName(), treeUri,
                // Intent.FLAG_GRANT_READ_URI_PERMISSION |
                // Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                final int takeFlags = data.getFlags()
                        & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            }
        }
    }
}

Теперь сохраните папку для сохранения в общих настройках не задавать пользователю выбрать папку каждый раз, когда вы хотите, чтобы сохранить изображение.

Вы должны использовать DocumentFileкласс , чтобы сохранить изображение, а не Fileили ParcelFileDescriptor, для получения дополнительной информации вы можете проверить эту нить для сохранения изображения на SD - карту с compress(CompressFormat.JPEG, 100, out);методом и DocumentFileклассами.

Ответил 15/09/2017 d 11:42
источник пользователем

голоса
0

// | == | Создание PNG файлов из растрового изображения:

void devImjFylFnc(String pthAndFylTtlVar, Bitmap iptBmjVar)
{
    try
    {
        FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar);
        iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar);
        fylBytWrtrVar.close();
    }
    catch (Exception errVar) { errVar.printStackTrace(); }
}

// | == | Получить Bimap из файла:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}
Ответил 29/06/2017 d 19:22
источник пользователем

голоса
0

Не на самом деле ответ, но комментарий. Я на Mac работает среду эмулятора, и получить java.io.IOException: Разрешение отказано - ошибка с этим кодом:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    Log.d("DEBUG", "onActivityResult called");
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    if(requestCode == 0 && resultCode == RESULT_OK) {
        Log.d("DEBUG", "result is ok");
        try{
            Bitmap map = (Bitmap) imageReturnedIntent.getExtras().get("data");
            File sd = new File(Environment.getExternalStorageDirectory(), "test.png");
            sd.mkdirs();
            sd.createNewFile();
            FileOutputStream out = new FileOutputStream(sd);
            map.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Я также добавил использования, разрешение android.permission.WRITE_EXTERNAL_STORAGE в файле манифеста (как отмечено другими).

Ответил 11/03/2017 d 17:26
источник пользователем

голоса
0

Убедитесь , что каталог создается перед вызовом bitmap.compress:

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
Ответил 18/02/2016 d 19:21
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more