บันทึกบิตแมปไปยังตำแหน่ง


469

ฉันกำลังทำงานกับฟังก์ชั่นในการดาวน์โหลดภาพจากเว็บเซิร์ฟเวอร์แสดงบนหน้าจอและหากผู้ใช้ต้องการเก็บภาพไว้ให้บันทึกลงในการ์ด SD ในโฟลเดอร์บางโฟลเดอร์ มีวิธีง่าย ๆ ในการบิตแมปและบันทึกลงในการ์ด SD ในโฟลเดอร์ที่ฉันเลือกหรือไม่?

ปัญหาของฉันคือฉันสามารถดาวน์โหลดภาพแสดงบนหน้าจอเป็นบิตแมป วิธีเดียวที่ฉันสามารถค้นหาเพื่อบันทึกภาพไปยังโฟลเดอร์เฉพาะคือการใช้ FileOutputStream แต่ต้องใช้อาร์เรย์ไบต์ ฉันไม่แน่ใจวิธีการแปลง (ถ้าเป็นวิธีที่ถูกต้อง) จาก Bitmap ไปเป็นอาร์เรย์ไบต์ดังนั้นฉันสามารถใช้ FileOutputStream เพื่อเขียนข้อมูลได้

ตัวเลือกอื่นที่ฉันมีคือการใช้ MediaStore:

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

ซึ่งใช้งานได้ดีในการบันทึกลงในการ์ด SD แต่ไม่อนุญาตให้คุณปรับแต่งโฟลเดอร์


สิ่งที่ฉันทำในแอพของฉัน ฉันดาวน์โหลดเว็บเซิร์ฟเวอร์รูปแบบภาพขนาดใหญ่จัดการกับมันและโหลดบิตแมปโดยตรงไปยัง imageview ผ่านทางmImage.setImageBitmap(_result.getBitmap());ในการonTaskComplete()โทรกลับของฉัน ตอนนี้ฉันต้องอนุญาตให้ผู้ใช้บันทึกไฟล์ไว้ในเครื่องหากพวกเขาต้องการผ่านเมนูบริบทแบบกดยาว ฉันควรจะใช้วิธีแก้ปัญหาด้านล่าง สิ่งที่ฉันต้องการรู้ว่าคุณค้นพบวิธีที่ดีกว่านี้หรือไม่?
wired00

มีวิธีที่สง่างามของการทำที่นี่: stackoverflow.com/questions/4263375//
Chepech

คำตอบ:


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

11
ฉันบีบอัดภาพด้วยเช่นกัน แต่ถึง 100 เปอร์เซ็นต์และเมื่อฉันได้รับภาพของฉันลงในผืนผ้าใบมันก็เล็กมาก ด้วยเหตุผลใด
AZ_

3
@Aizaz สิ่งนี้จะไม่เปลี่ยนขนาดของรูปภาพเพียงแค่รูปแบบและคุณภาพ (อาจ) นอกจากนี้ยังเป็นที่น่าสังเกตว่าคุณภาพการบีบอัด90ในตัวอย่างด้านบนจะไม่มีผลใด ๆ เมื่อบันทึกเป็น PNG แต่จะสร้างความแตกต่างให้กับ JPEG ในกรณีของ JPEG คุณสามารถเลือกหมายเลขใดก็ได้ระหว่าง 0 ถึง 100
ไถนา

1
ควรสังเกตว่าการบันทึกด้วยวิธีนี้สำหรับ. JPEG ที่มีคุณภาพ 100% จริงจะบันทึกภาพที่แตกต่างจากต้นฉบับที่เว็บ (อย่างน้อยจะใช้พื้นที่มากขึ้น) พิจารณาแนวทางอื่น
Warpzit

42
มีใครต้องบีบอัดใหม่? ฉันแค่ต้องการบันทึกภาพต้นฉบับ
Hein du Plessis

2
@HeinduPlessis ไม่ต้องทำ แต่คุณน่าจะทำ การบันทึกบิตแมปแบบดิบจะใช้พื้นที่มากขึ้นขึ้นอยู่กับรูปแบบ (ตัวอย่างเช่น ARGB_4444 เทียบกับ ARGB_8888)
irwinb

134

คุณควรใช้Bitmap.compress()วิธีการบันทึก Bitmap เป็นไฟล์ มันจะบีบอัด (ถ้ารูปแบบที่ใช้อนุญาตให้มัน) รูปภาพของคุณและดันเข้าไปใน 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());

@JoaquinG ด้วยเหตุผลใดที่fOut.flush()เป็นไปไม่ได้ที่จะละเว้นหรือไม่
Niklas

@ Niklas ฉันคิดว่าคุณสามารถละเว้นล้างออก
JoaquinG

1
คุณควรเปลี่ยนข้อความจาก "อัตราการบีบอัด 85%" เป็น "อัตราคุณภาพ 85%" เพื่อความกำกวมน้อยลง ฉันจะตีความ "อัตราการบีบอัดของ 85%" เพื่อหมายถึง "คุณภาพ 15%" แต่พารามิเตอร์ int ของการBitmap.compressระบุคุณภาพ
Tim Cooke

คุณช่วยโพสต์วิธีการได้ไหมgetImageBitmap(myurl)
Aashish

38
outStream = new FileOutputStream(file);

จะโยนข้อยกเว้นโดยไม่ได้รับอนุญาตใน AndroidManifest.xml (อย่างน้อยใน os2.2):

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

10
หากไฟล์ของคุณ absolutePath เป็นพา ธ ภายใน
Blundell

24

ภายใน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();
}

7
คุณกำลังเรียกมันว่า "pippo.jpg" แต่คุณกำลังใช้การบีบอัด PNG
Ralphleon

1
รูปแบบการบีบอัดควรเป็น. JPEG หากคุณต้องการเปลี่ยนคุณภาพของบิตแมป ไม่สามารถเปลี่ยนแปลงคุณภาพในรูปแบบ PNG
Mustafa Güven

13

บางรูปแบบเช่น PNG ที่ไม่มีการสูญเสียจะเพิกเฉยต่อการตั้งค่าคุณภาพ


2
PNG ยังคงเป็นรูปแบบการบีบอัด การตั้งค่าคุณภาพไม่ได้แก้ไขคุณภาพการบีบอัดหรือไม่
Tamás Barta

สถานะเอกสาร (ไฮไลต์โดยฉัน): คำแนะนำเกี่ยวกับคอมเพรสเซอร์, 0-100 0 หมายถึงการบีบอัดสำหรับขนาดเล็ก 100 หมายถึงการบีบอัดเพื่อคุณภาพสูงสุด บางรูปแบบเช่น PNG ที่ไม่มีการสูญเสียจะเพิกเฉยต่อการตั้งค่าคุณภาพ
Stephan Henningsen

10

นี่คือตัวอย่างรหัสสำหรับการบันทึกบิตแมปไปยังไฟล์:

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

ฉันหวังว่ามันจะช่วยคุณ รหัสชีวิตมีความสุข


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

}

1
คุณไม่จำเป็นต้องล้าง outStream ถ้าคุณผ่านวิธีนั้นใน 'การบีบอัด' วิธีการนั้นจะทำในนามของคุณ
dharam

7

ทำไมไม่เรียกใช้Bitmap.compressเมธอดด้วย 100 (ซึ่งฟังดูเหมือนว่าจะไม่สูญเสีย)?


แม้ว่ามันจะถูกเพิกเฉยก็ควรจะเป็น 100 ถ้าสักวันหนึ่งรูปแบบการบีบอัดจะถูกเปลี่ยนเป็นแบบหลวม ๆ ภาพจะจับคู่อย่างใกล้ชิดกับมันมากที่สุด โปรดทราบด้วยว่าหากคุณมีรหัสที่สรุปว่าการโทรนี้อาจสำคัญกว่า
ddcruver

2
100% ไม่สูญเสียโดยใช้ JPEG, FWIW คุณสามารถตรวจสอบได้โดยการโหลดและบันทึกบิตแมปซ้ำ ๆ

5

ฉันต้องการบันทึกภาพด้วย แต่ปัญหาของฉัน (?) คือการที่ฉันต้องการบันทึกจากบิตแมปที่วาด ive

ฉันทำแบบนี้:

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

 }

วิธีการบันทึกของคุณใช้งานได้สำหรับฉันเท่านั้น .. หลังจากเสียเวลาไปหลายชั่วโมง .. ขอบคุณมากครับ
Mohammed Sufian

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

ค่า 85 ที่นี่ไม่สมเหตุสมผลเนื่องจาก PNG ไม่มีความสูญเสีย เอกสารกล่าวว่า - `รูปแบบบางรูปแบบเช่น PNG ที่ไม่มีการสูญเสียจะเพิกเฉยต่อการตั้งค่าคุณภาพ '
Minhaz

2

สร้างภาพขนาดย่อของวิดีโอสำหรับวิดีโอ อาจส่งคืนค่าว่างหากวิดีโอเสียหายหรือไม่รองรับรูปแบบ

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

2

คุณต้องการบันทึกบิตแมปไปยังไดเรกทอรีที่คุณเลือก ฉันสร้างไลบรารี ImageWorker ที่ช่วยให้ผู้ใช้สามารถโหลดบันทึกและแปลงภาพบิตแมป / drawables / base64

SDK ขั้นต่ำ - 14

ก่อนจำเป็น

  • การบันทึกไฟล์จะต้องได้รับอนุญาตจาก WRITE_EXTERNAL_STORAGE
  • การดึงไฟล์จะต้องได้รับอนุญาต READ_EXTERNAL_STORAGE

การบันทึก Bitmap / 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()

การดำเนินงาน

เพิ่มการพึ่งพา

ในระดับโครงการ

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

ในระดับการสมัคร Gradle

dependencies {
            implementation 'com.github.ihimanshurawat:ImageWorker:0.51'
    }

คุณสามารถอ่านเพิ่มเติมได้ที่https://github.com/ihimanshurawat/ImageWorker/blob/master/README.md


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**")

มันจะฟังดูแล้วว่า IM แค่การฟาดฟันไปรอบ ๆ แต่ลองอีกครั้งเมื่อมันจะได้รับการบันทึกใน bmp foramt .. ไชโย


1

ตรวจสอบให้แน่ใจว่ามีการสร้างไดเรกทอรีก่อนที่คุณจะโทรbitmap.compress:

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

1

หลังจาก Android 4.4 Kitkat และ ณ ปี 2017 แบ่งใช้ Android 4.4 และน้อยกว่าประมาณ 20% และลดลงจึงไม่สามารถบันทึกลงในการ์ด SD โดยใช้FileคลาสและgetExternalStorageDirectory()วิธีการ วิธีนี้จะส่งคืนหน่วยความจำภายในและอุปกรณ์ของคุณที่ทุกภาพสามารถมองเห็นได้ คุณยังสามารถบันทึกรูปภาพส่วนตัวในแอพของคุณและจะถูกลบเมื่อผู้ใช้ลบแอพของคุณด้วยopenFileOutput()วิธีการ

เริ่มต้นด้วย Android 6.0 คุณสามารถฟอร์แมตการ์ด SD ของคุณเป็นหน่วยความจำภายใน แต่เป็นส่วนตัวกับอุปกรณ์ของคุณ (หากคุณจัดรูปแบบ SD รถยนต์เป็นหน่วยความจำภายในอุปกรณ์ของคุณเท่านั้นที่สามารถเข้าถึงหรือดูเนื้อหา) คุณสามารถบันทึกลง SD การ์ดได้ คำตอบอื่น ๆ แต่ถ้าคุณต้องการใช้การ์ด SD แบบถอดได้คุณควรอ่านคำตอบของฉันด้านล่าง

คุณควรใช้Storage Access Frameworkเพื่อรับ uri ไปยังโฟลเดอร์onActivityResultของกิจกรรมเพื่อรับโฟลเดอร์ที่เลือกโดยผู้ใช้และเพิ่มสิทธิ์อนุญาตที่คงอยู่แบบ retreive เพื่อให้สามารถเข้าถึงโฟลเดอร์ได้หลังจากผู้ใช้รีสตาร์ทอุปกรณ์

@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คลาส


1

อุปกรณ์ใหม่บางตัวไม่บันทึกบิตแมปดังนั้นฉันจึงอธิบายเพิ่มเติมเล็กน้อย

ตรวจสอบให้แน่ใจว่าคุณได้รับอนุญาตด้านล่าง

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

และสร้างไฟล์ xml ภายใต้xmlชื่อ folder 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);
    }

คุณมีข้อมูลเพิ่มเติมหรือไม่error handling for PIE devices..และฉันคิดว่าการสอบถามซ้ำgetOutputMediaFileอาจเป็นลูปไม่สิ้นสุดหากการแก้ปัญหาล้มเหลว
Raimund Wege

0

บันทึกบิตแมปไปที่คลังภาพของคุณโดยไม่บีบอัด

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.");
    }
}

-1

// | == | สร้างไฟล์ 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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.