Вопрос:

Сохранить растровое изображение в местоположении

android bitmap save

425520 просмотра

17 ответа

8513 Репутация автора

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

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

Другой вариант - использовать MediaStore:

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

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

Автор: Chrispix Источник Размещён: 16.03.2009 03:26

Ответы (17)


8 плюса

49576 Репутация автора

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

Автор: TofuBeer Размещён: 16.03.2009 04:10

834 плюса

10364 Репутация автора

Решение
try (FileOutputStream 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 (IOException e) {
    e.printStackTrace();
}
Автор: Ulrich Scheller Размещён: 23.03.2009 11:22

13 плюса

466 Репутация автора

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

Автор: shinydev Размещён: 09.12.2009 01:53

126 плюса

1841 Репутация автора

Вы должны использовать 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());
Автор: JoaquinG Размещён: 10.06.2010 10:42

6 плюса

89 Репутация автора

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

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

 @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();
            }

 }
Автор: user511895 Размещён: 18.11.2010 09:26

8 плюса

1951 Репутация автора

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) {

}
Автор: Ashish Anand Размещён: 22.06.2011 09:25

34 плюса

481 Репутация автора

outStream = new FileOutputStream(file);

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Автор: user996042 Размещён: 14.10.2011 10:57

23 плюса

231 Репутация автора

Внутри 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();
}
Автор: Alessandro Размещён: 25.01.2012 04:19

1 плюс

2547 Репутация автора

Эй, просто дайте имя .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**")

это будет звучать так, будто я ПРОСТО ДУМАЛ ВО ВРЕМЯ, но попробуйте, как только он будет сохранен в bmp foramt..Cheers

Автор: Mayank Saini Размещён: 22.01.2013 11:47

5 плюса

379 Репутация автора

Способ, который я нашел для отправки 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")));
Автор: JulienGenoud Размещён: 08.04.2015 09:52

1 плюс

241 Репутация автора

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

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
Автор: user5480949 Размещён: 18.02.2016 07:21

8 плюса

1757 Репутация автора

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

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);

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

Автор: A-Droid Tech Размещён: 02.04.2016 09:41

0 плюса

929 Репутация автора

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

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 в файл манифеста (как отмечалось другими).

Автор: stian Размещён: 11.03.2017 05:26

0 плюса

1836 Репутация автора

// | == | Создайте файл 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);
}
Автор: Sujay U N Размещён: 29.06.2017 07:22

1 плюс

1637 Репутация автора

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

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

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

@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классами.

Автор: Thracian Размещён: 15.09.2017 11:42

2 плюса

929 Репутация автора

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

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;
} 
Автор: MashukKhan Размещён: 28.06.2018 01:17

0 плюса

138 Репутация автора

Вы хотите сохранить растровое изображение в каталог по вашему выбору. Я сделал библиотеку ImageWorker, которая позволяет пользователю загружать, сохранять и конвертировать растровые изображения / drawables / base64 изображения.

Мин СДК - 14

Предпосылка

  • Для сохранения файлов потребуется разрешение WRITE_EXTERNAL_STORAGE.
  • Для получения файлов потребуется разрешение READ_EXTERNAL_STORAGE.

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

ImageWorker.to(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    save(sourceBitmap,85)

Загрузка растрового изображения

val bitmap: Bitmap? = ImageWorker.from(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    load()

Реализация

Добавить зависимости

На уровне проекта Gradle

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

На уровне приложения Gradle

dependencies {
            implementation 'com.github.1AboveAll:ImageWorker:0.51'
    }

Вы можете прочитать больше на https://github.com/1AboveAll/ImageWorker/blob/master/README.md

Автор: Himanshu Rawat Размещён: 09.12.2018 04:44
Вопросы из категории :
32x32