سؤال

أنا أعمل على وظيفة لتحميل صورة من ملقم ويب, عرض على الشاشة ، إذا كان المستخدم يرغب في الحفاظ على الصورة حفظ على بطاقة SD في مجلد معين.هل هناك طريقة سهلة لأخذ صورة نقطية فقط حفظ إلى بطاقة SD في مجلد من اختياري ؟

مشكلتي هي أنني يمكن تحميل صورة, عرض على الشاشة كصورة نقطية.الطريقة الوحيدة لقد كنت قادرا على العثور على حفظ صورة إلى مجلد معين هو استخدام FileOutputStream ، ولكن هذا يتطلب صفيف بايت.أنا غير متأكد من كيفية تحويل (إذا كان هذا هو الطريق الصحيح) من الصورة النقطية إلى صفيف بايت لذا يمكن استخدام FileOutputStream لكتابة البيانات.

الخيار الآخر يجب استخدام MediaStore :

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

الذي يعمل بشكل جيد إلى حفظ إلى بطاقة SD, ولكن لا يسمح لك لتخصيص مجلد.

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

ويجب عليك استخدام أسلوب Bitmap.compress() لحفظ نقطية كملف. وسوف ضغط (إذا كان الشكل المستخدم يسمح لها) صورتك ودفعها إلى OutputStream.

وهنا مثال مثيل نقطية الحصول عليها من خلال 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());
outStream = new FileOutputStream(file);

وسوف يلقي استثناء من دون إذن في AndroidManifest.xml (على الأقل في os2.2):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

وداخل 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();
}

وبعض الأشكال، مثل PNG وهو ضياع، سيتم تجاهل إعداد جودة.

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

}

وهنا هو رمز عينة لحفظ الصورة النقطية إلى الملف:

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 سعيدة.

لماذا لا استدعاء الأسلوب Bitmap.compress مع 100 (والذي يبدو وكأنه هو ضياع)؟

وأود أيضا لحفظ الصورة. ولكن مشكلتي (؟) هي التي أريد لحفظه من الصورة النقطية التي إيف drawed.

وأنا جعلت من مثل هذا:

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

 }

والطريقة وجدت لإرسال 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")));

إنشاء فيديو من الصور المصغرة للفيديو.قد تعود فارغة إذا كان شريط الفيديو هو معطوبة أو تنسيق غير معتمد.

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

مرحبا فقط تعطي اسم .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..هتاف

تأكد من إنشاء الدليل قبل استدعاء bitmap.compress:

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();

وبعد الروبوت 4.4 كات، واعتبارا من 2017 حصة أندرويد 4.4 وأقل من 20٪ وخفض، فإنه من غير الممكن لإنقاذ لبطاقة SD باستخدام الطبقة File وطريقة getExternalStorageDirectory(). هذا الأسلوب بإرجاع الذاكرة الداخلية للجهاز وحفظ الصور واضحة إلى كل التطبيق. يمكنك أيضا حفظ الصور الخاصة فقط إلى التطبيق الخاص بك ويتم حذفها عند حذف مستخدمي التطبيق الخاص بك مع طريقة openFileOutput().

وبدءا من الروبوت 6.0، يمكنك تنسيق بطاقة SD الخاصة بك كما ذاكرة داخلية ولكن القطاع الخاص فقط على جهازك (إذا قمت بتهيئة السيارة SD وذاكرة داخلية، إلا أن الجهاز يمكن الوصول أو نرى انها المحتويات) يمكنك حفظ إلى أن بطاقة SD باستخدام إجابات أخرى ولكن إذا كنت ترغب في استخدام بطاقة SD القابلة للإزالة يجب عليك قراءة جوابي أدناه.

ويجب عليك استخدام على إطار الوصول التخزين لتحصل اوري إلى مجلد طريقة 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، لمزيد من المعلومات يمكنك التحقق <لأ href = "https://stackoverflow.com/questions/45924864/saving-an-image-after-getting -folder-من-التخزين الوصول إطار واجهة المستخدم "> هذا الموضوع لإنقاذ صورة لبطاقة SD مع الطريقة وcompress(CompressFormat.JPEG, 100, out); الطبقات DocumentFile.

كنت تريد حفظ صورة نقطية إلى دليل من اختيارك.لقد جعلت من مكتبة ImageWorker التي تمكن المستخدم من تحميل وحفظ تحويل الصور النقطية/بكسل/base64 الصور.

مين SDK - 14

Pre-requisite

  • حفظ الملفات تتطلب 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

بعض الأجهزة الجديدة لا حفظ صورة نقطية لذلك شرحت أكثر قليلا..

تأكد من أن قمت بإضافة دون إذن

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

و إنشاء ملف xml تحت xml اسم المجلد provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

و في AndroidManifest تحت

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

ثم ببساطة الاتصال saveBitmapFile(passYourBitmapHere)

public static void saveBitmapFile(Bitmap bitmap) throws IOException {
        File mediaFile = getOutputMediaFile();
        FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, getQualityNumber(bitmap), fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

حيث

File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment.getExternalStorageDirectory(),
                "easyTouchPro");
        if (mediaStorageDir.isDirectory()) {

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                    .format(Calendar.getInstance().getTime());
            String mCurrentPath = mediaStorageDir.getPath() + File.separator
                            + "IMG_" + timeStamp + ".jpg";
            File mediaFile = new File(mCurrentPath);
            return mediaFile;
        } else { /// error handling for PIE devices..
            mediaStorageDir.delete();
            mediaStorageDir.mkdirs();
            galleryAddPic(mediaStorageDir);

            return (getOutputMediaFile());
        }
    }

وغيرها من الأساليب

public static int getQualityNumber(Bitmap bitmap) {
        int size = bitmap.getByteCount();
        int percentage = 0;

        if (size > 500000 && size <= 800000) {
            percentage = 15;
        } else if (size > 800000 && size <= 1000000) {
            percentage = 20;
        } else if (size > 1000000 && size <= 1500000) {
            percentage = 25;
        } else if (size > 1500000 && size <= 2500000) {
            percentage = 27;
        } else if (size > 2500000 && size <= 3500000) {
            percentage = 30;
        } else if (size > 3500000 && size <= 4000000) {
            percentage = 40;
        } else if (size > 4000000 && size <= 5000000) {
            percentage = 50;
        } else if (size > 5000000) {
            percentage = 75;
        }

        return percentage;
    }

و

void galleryAddPic(File f) {
        Intent mediaScanIntent = new Intent(
                "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);

        this.sendBroadcast(mediaScanIntent);
    }

وليس في الواقع جوابا، ولكن تعليق. وأنا على تشغيل ماك البيئة منافس، والحصول على 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 الاستخدامات إذن لملف البيان (كما لوحظ من قبل الآخرين).

حفظ صورة نقطية إلى معرض الصور الخاص بك دون ضغط.

private File saveBitMap(Context context, Bitmap Final_bitmap) {
    File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Your Folder Name");
    if (!pictureFileDir.exists()) {
        boolean isDirectoryCreated = pictureFileDir.mkdirs();
        if (!isDirectoryCreated)
            Log.i("TAG", "Can't create directory to save the image");
        return null;
    }
    String filename = pictureFileDir.getPath() + File.separator + System.currentTimeMillis() + ".jpg";
    File pictureFile = new File(filename);
    try {
        pictureFile.createNewFile();
        FileOutputStream oStream = new FileOutputStream(pictureFile);
        Final_bitmap.compress(Bitmap.CompressFormat.PNG, 100, oStream);
        oStream.flush();
        oStream.close();
        Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue saving the image.");
    }
    scanGallery(context, pictureFile.getAbsolutePath());
    return pictureFile;
}
private void scanGallery(Context cntx, String path) {
    try {
        MediaScannerConnection.scanFile(cntx, new String[]{path}, null, new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue scanning gallery.");
    }
}

و// | == | إنشاء ملف 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top