বিটম্যাপটি লোকেশনটিতে সংরক্ষণ করুন


469

আমি একটি ওয়েব সার্ভার থেকে একটি ছবি ডাউনলোড করতে, এটি স্ক্রিনে প্রদর্শন করতে এবং যদি ব্যবহারকারী চিত্রটি রাখতে চান তবে একটি নির্দিষ্ট ফোল্ডারে এটি এসডি কার্ডে সংরক্ষণ করুন function আমার পছন্দসই একটি ফোল্ডারে একটি বিটম্যাপ নেওয়া এবং এটি কেবল এসডি কার্ডে সংরক্ষণ করার কোনও সহজ উপায় আছে?

আমার সমস্যাটি হ'ল আমি চিত্রটি ডাউনলোড করতে পারি, এটি বিটম্যাপ হিসাবে পর্দায় প্রদর্শন করতে পারি। কোনও নির্দিষ্ট ফোল্ডারে কোনও চিত্র সংরক্ষণ করতে আমি কেবলমাত্র সক্ষম হয়েছি তা হল ফাইলআউটপুটস্ট্রিম ব্যবহার করা, তবে এর জন্য একটি বাইট অ্যারের প্রয়োজন requires আমি কীভাবে বিটম্যাপ থেকে বাইট অ্যারে রূপান্তর করতে পারি (যদি এটি এমনকি সঠিক উপায়ে হয়) তবে আমি ডেটা লেখার জন্য একটি ফাইলআউটপুটস্ট্রিম ব্যবহার করতে পারি।

আমার কাছে অন্য বিকল্পটি হ'ল মিডিয়া স্টোর ব্যবহার করা:

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

যা এসডি কার্ডে সংরক্ষণে সূক্ষ্ম কাজ করে তবে আপনাকে ফোল্ডারটি কাস্টমাইজ করতে দেয় না।


আমি আমার অ্যাপ্লিকেশনটিতে ঠিক কী করছি। আমি এটি একটি বড় ইমেজ ফর্ম ওয়েবসার্ভার ডাউনলোড করে ডাউনলোড করি এবং বিটম্যাপটি সরাসরি mImage.setImageBitmap(_result.getBitmap());আমার onTaskComplete()কলব্যাকের মাধ্যমে একটি চিত্র দর্শনে লোড করি । আমি এখন ব্যবহারকারীদের দীর্ঘ প্রেস কনটেক্সট মেনুতে চাইলে তারা স্থানীয়ভাবে ফাইলটি সংরক্ষণ করার অনুমতি দিতে হবে। আমার নীচের সমাধানটি ব্যবহার করতে সক্ষম হওয়া উচিত। আমি যদিও জানতে চাই, আপনি কি এর থেকে আরও ভাল পদ্ধতির আবিষ্কার করেছেন?
ওয়্যার্ড 100

আছে: একটি উপায় তা এখানে এরকম মার্জিত উপায় 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 শতাংশ এবং যখন আমি আমার চিত্রটি ক্যানভাসে পেয়ে যাচ্ছি তখন এটি খুব ছোট। যে কোনো কারণে?
এজেড_

3
@ আইজাজ এটি চিত্রের আকার পরিবর্তন করবে না, কেবলমাত্র ফর্ম্যাট এবং (সম্ভাব্য) মানের। এটিও লক্ষণীয় যে, সংক্ষেপণের মানটি, 90উপরের উদাহরণে পিএনজি হিসাবে সংরক্ষণের সময় কোনও প্রভাব ফেলবে না, তবে জেপিজি'র জন্য একটি পার্থক্য আনবে। কোন JPEG ক্ষেত্রে, আপনি 0 এবং 100 মধ্যে কোনো সংখ্যা নির্বাচন করতে পারবেন
চাষা

1
এটি লক্ষ করা উচিত যে 100% মানের সহ .JPEG এর জন্য এইভাবে সংরক্ষণ করা ওয়েবে মূলটির চেয়ে আলাদা চিত্রটি সংরক্ষণ করবে (কমপক্ষে আরও অনেক বেশি জায়গা লাগবে), বিকল্প পদ্ধতির বিবেচনা করুন।
ওয়ার্পজিট

42
কেউ কি পুনরায় সংশোধন করতে হবে ? আমি কেবল আসল চিত্রটি সংরক্ষণ করতে চাই।
হেইন ডু

2
@ হিন্ডুপ্লেসিস নেই তবে আপনার সম্ভবত করা উচিত। কাঁচা বিটম্যাপটি সংরক্ষণ করা ফর্ম্যাটের উপর নির্ভর করে (উদাহরণস্বরূপ ARGB_4444 বনাম ARGB_8888) আরও অনেক বেশি জায়গা নেবে।
ইরুইনব

134

Bitmap.compress()বিটম্যাপটিকে ফাইল হিসাবে সংরক্ষণ করার জন্য আপনার পদ্ধতিটি ব্যবহার করা উচিত । এটি আপনার চিত্রকে সংকুচিত করবে (যদি ব্যবহৃত ফর্ম্যাটটি এটির অনুমতি দেয়) এবং এটিকে আউটপুট স্ট্রিমের দিকে ঠেলে দেবে।

এখানে বিটম্যাপের উদাহরণটি পাওয়া একটি উদাহরণ getImageBitmap(myurl)যা 85% এর সংকোচনের হারের সাথে JPEG হিসাবে সংকুচিত করা যেতে পারে:

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

@ জোয়াউকিনজি এর কোনও কারণেই fOut.flush()কি এটি বাদ দেওয়া সম্ভব নয়?
নিক্লাস

@ নিক্লাস আমি মনে করি আপনি ফ্লাশ বাদ দিতে পারেন।
JoaquinG

1
আপনার অস্পষ্টতার জন্য আপনার শব্দটি "85% এর সংক্ষেপণ হার" থেকে "85% মানের মানের" হিসাবে পরিবর্তন করা উচিত। আমি "85% এর সংকোচনের হার" এর অর্থ "15% গুণমান" হিসাবে ব্যাখ্যা করব, তবে গুণমানের ইনট প্যারামিটার Bitmap.compressউল্লেখ করে।
টিম কুক

আপনি কি পদ্ধতিটি পোস্ট করতে পারবেনgetImageBitmap(myurl)
আশিষ

38
outStream = new FileOutputStream(file);

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ছাড়াই ব্যতিক্রম ছুঁড়ে ফেলা হবে (কমপক্ষে os2.2 এ):

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

10
না যদি আপনার ফাইল পরমপথটি কোনও অভ্যন্তরীণ পথ?
ব্লুন্ডেল

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" বলছেন তবে আপনি পিএনজি সংকোচন ব্যবহার করছেন
র‌্যালফিলিয়ন

1
সংক্ষেপণ বিন্যাসটি জেপিইজি হওয়া উচিত যদি আপনি বিটম্যাপের মান পরিবর্তন করতে চান। মানের পিএনজি ফর্ম্যাটে পরিবর্তন করা যাবে না।
মোস্তফা গেভেন

13

পিএনজির মতো কিছু ফর্ম্যাট যা ক্ষতিহীন, মান সেটিংটিকে উপেক্ষা করবে।


2
পিএনজি এখনও একটি সঙ্কোচিত বিন্যাস। গুণমানের সেটিংটি কী সংকোচনের মানের পরিবর্তন করে না?
ট্যামস বার্তা

দস্তাবেজগুলির রাজ্য (আমার দ্বারা হাইলাইট করা): সংক্ষেপককে ইঙ্গিত, 0-100। 0 ছোট আকারের জন্য সংকোচনের অর্থ, সর্বাধিক মানের জন্য সংকোচনের 100 টি। পিএনজির মতো কিছু ফর্ম্যাট যা নিরবিচ্ছিন্ন, মান নির্ধারণকে উপেক্ষা করবে
স্টিফান হেনিংসন

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
আপনি যদি 'সংক্ষেপণ' পদ্ধতিতে পাস করে থাকেন তবে আপনাকে প্রবাহকে ফ্লাশ করতে হবে না। এই পদ্ধতিটি আপনার পক্ষ থেকে করবে।
ধরম

7

Bitmap.compress100 টি দিয়ে পদ্ধতিটি কল করবেন না (যা মনে হচ্ছে এটি ক্ষতিহীন?)


যদিও এটি উপেক্ষা করা হয় এটি 100 হওয়া উচিত some এছাড়াও মনে রাখবেন যে আপনার কাছে এমন কোড রয়েছে যা এই কলটিকে সম্ভবত বিস্মৃত করে maybe
ddcruver

2
100% জেপিজি, এফডাব্লুআইডাব্লুহীন নয়। আপনি বার বার বিটম্যাপটি লোড করে এবং সংরক্ষণ করে এটি যাচাই করতে পারেন।

5

আমি একটি ছবিও সংরক্ষণ করতে চাই। তবে আমার সমস্যা (?) হ'ল আমি এটিকে আঁকানো বিটম্যাপ থেকে এটি সংরক্ষণ করতে চাই।

আমি এটি এইভাবে তৈরি করেছি:

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

 }

আপনার সংরক্ষণ পদ্ধতিটি কেবল আমার জন্য কাজ করে .. কয়েক ঘন্টা নষ্ট করার পরে .. অনেক ধন্যবাদ স্যার।
মোহাম্মদ সুফিয়ান

5

আমি পিএনজি এবং স্বচ্ছতা প্রেরণের জন্য যেভাবে খুঁজে পেয়েছি।

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 মানটি বোঝায় না। ডকুমেন্টেশন বলেছেন - 'কিছু বিন্যাসের, পিএনজি মত যা অবচয়হীন হয়, মান setting` উপেক্ষা করা হবে
মিনহাজ

2

একটি ভিডিওর জন্য একটি ভিডিও থাম্বনেইল তৈরি করুন। ভিডিওটি দূষিত হলে বা ফর্ম্যাটটি সমর্থন না করা হলে এটি শূন্য হতে পারে।

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

এসডিকার্ডে আপনার বিটম্যাপটি সংরক্ষণ করতে নিম্নলিখিত কোডটি ব্যবহার করুন

স্টোর ইমেজ

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

আপনি আপনার চয়েস ডিরেক্টরিতে বিটম্যাপ সংরক্ষণ করতে চান। আমি একটি লাইব্রেরি ইমেজ ওয়ার্কার তৈরি করেছি যা ব্যবহারকারীকে বিটম্যাপগুলি / অঙ্কনযোগ্য / বেস 64 চিত্রগুলি লোড করতে, সংরক্ষণ এবং রূপান্তর করতে সক্ষম করে।

ন্যূনতম এসডিকে - 14

যোগদানের পূর্ব শর্ত

  • ফাইলগুলি সংরক্ষণের জন্য WRITE_EXTERNAL_STORAGE অনুমতি প্রয়োজন।
  • ফাইলগুলি পুনরুদ্ধার করতে READ_EXTERNAL_STORAGE অনুমতি প্রয়োজন।

বিটম্যাপ / ড্রয়যোগ্য / বেস 64 সংরক্ষণ করা হচ্ছে

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

অ্যাপ্লিকেশন স্তরের গ্রেডলে

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

এটি শুনতে পাবে যে আইএম কেবলই এর পূর্বেই ফুলিং করছে তবে একবার চেষ্টা করুন এটি একবার বিএমপি ফোরামটিতে রক্ষা পেয়েছে..চায়ার্স


1

আপনি কল করার আগে ডিরেক্টরিটি তৈরি হয়েছে তা নিশ্চিত করুন bitmap.compress:

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

1

অ্যানড্রয়েড ৪.৪ কিটকাটের পরে এবং অ্যান্ড্রয়েড ৪.৪ ভাগের কম ভাগের পরিমাণ প্রায় ২০% এবং কমছে, Fileক্লাস এবং getExternalStorageDirectory()পদ্ধতি ব্যবহার করে এসডি কার্ডে সংরক্ষণ করা সম্ভব নয় । এই পদ্ধতিটি আপনার ডিভাইসটির অভ্যন্তরীণ মেমরি ফিরিয়ে দেয় এবং চিত্রগুলি প্রতিটি অ্যাপ্লিকেশনটিতে দৃশ্যমান সংরক্ষণ করে। আপনি কেবল আপনার অ্যাপ্লিকেশনটিতে ব্যক্তিগতকৃত চিত্রগুলি সংরক্ষণ করতে পারেন এবং যখন ব্যবহারকারী আপনার অ্যাপ্লিকেশনটি মুছে ফেলেন তখন মুছে ফেলা হবেopenFileOutput() পদ্ধতিতে ।

অ্যান্ড্রয়েড .0.০ দিয়ে শুরু করে আপনি নিজের এসডি কার্ডটিকে একটি অভ্যন্তরীণ মেমরি হিসাবে ফর্ম্যাট করতে পারেন তবে কেবল আপনার ডিভাইসে ব্যক্তিগত ( অন্যান্য উত্তরগুলি কিন্তু আপনি যদি অপসারণযোগ্য এসডি কার্ড ব্যবহার করতে চান তবে আমার উত্তরটি নীচে পড়তে হবে।

ব্যবহারকারীর দ্বারা ফোল্ডার নির্বাচন করার জন্য ক্রিয়াকলাপের ফোল্ডারের পদ্ধতিতে uri পেতে আপনার স্টোরেজ অ্যাক্সেস ফ্রেমওয়ার্কটি ব্যবহার করা উচিত onActivityResultএবং ব্যবহারকারীর ডিভাইসটি পুনরায় চালু করার পরে ফোল্ডারে অ্যাক্সেস করতে সক্ষম হওয়ার জন্য পুনরায় চেষ্টা করার অনুমতি যুক্ত করা উচিত।

@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আরও তথ্যের জন্য, আপনি পরীক্ষা করতে পারবেন এই থ্রেড এসডি কার্ড ছবিতে সংরক্ষণের জন্য compress(CompressFormat.JPEG, 100, out);পদ্ধতি এবং DocumentFileক্লাস।


1

কিছু নতুন ডিভাইস বিটম্যাপ সংরক্ষণ করে না তাই আমি আরও কিছুটা ব্যাখ্যা করেছি ..

আপনি অনুমতি নীচে যোগ করেছেন তা নিশ্চিত করুন

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

এবং xmlফোল্ডার নাম প্রদানকারী_প্যাথস.এক্সএমএল এর অধীনে একটি এক্সএমএল ফাইল তৈরি করুন

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

এবং এর অধীনে অ্যান্ড্রয়েড ম্যানিফেস্টে

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

তারপরে কেবল সেভবিটম্যাপফায়ারকে কল করুন (পাসওয়্যার বিটম্যাপ এখানে)

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যে কাজের ব্যর্থতা ব্যর্থ হলে পুনরাবৃত্তি একটি অসীম লুপ হতে পারে।
রায়মুন্ড ওয়েজে

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

// | == | | বিটম্যাপ থেকে একটি পিএনজি ফাইল তৈরি করুন:

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

// | == | | ফাইল থেকে বিম্যাপ পান:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.