Ich arbeite an einer Funktion, um ein Bild von einem Webserver herunterzuladen und auf dem Bildschirm anzuzeigen. Wenn der Benutzer das Bild behalten möchte, speichern Sie es auf der SD-Karte in einem bestimmten Ordner. Gibt es eine einfache Möglichkeit, eine Bitmap zu erstellen und sie einfach auf der SD-Karte in einem Ordner meiner Wahl zu speichern?
Mein Problem ist, dass ich das Bild herunterladen und als Bitmap auf dem Bildschirm anzeigen kann. Die einzige Möglichkeit, ein Bild in einem bestimmten Ordner zu speichern, besteht darin, FileOutputStream zu verwenden. Dies erfordert jedoch ein Byte-Array. Ich bin nicht sicher, wie ich Bitmap in ein Byte-Array konvertieren soll (wenn dies sogar der richtige Weg ist). Daher kann ich einen FileOutputStream verwenden, um die Daten zu schreiben.
Die andere Möglichkeit, die ich habe, ist die Verwendung von MediaStore:
MediaStore.Images.Media.insertImage(getContentResolver(), bm,
barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
Dies funktioniert gut, um auf einer SD-Karte zu speichern, aber Sie können den Ordner nicht anpassen.
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();
}
Sie sollten die Bitmap.compress()
-Methode verwenden, um eine Bitmap als Datei zu speichern. Es komprimiert (wenn das verwendete Format es zulässt) Ihr Bild und drückt es in einen OutputStream.
Hier ist ein Beispiel einer Bitmap-Instanz, die über getImageBitmap(myurl)
abgerufen wird und als JPEG mit einer Komprimierungsrate von 85% komprimiert werden kann:
// 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);
wirft eine Ausnahme ohne Erlaubnis in AndroidManifest.xml (zumindest in os2.2)
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
Innerhalb 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();
}
Einige Formate, wie beispielsweise das verlustfreie PNG, ignorieren die Qualitätseinstellung.
Rufen Sie die Bitmap.compress
-Methode mit 100 auf (was sich als verlustfrei anhört).
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) {
}
Hier ist der Beispielcode zum Speichern der Bitmap in einer Datei:
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;
}
Rufen Sie nun diese Funktion auf, um die Bitmap im internen Speicher zu speichern.
File newfile = savebitmap(bitmap)
;
Ich hoffe es hilft dir. Fröhliches Code-Leben.
Ich möchte auch ein Bild speichern. Aber mein Problem (?) Ist, dass ich es von einer Bitmap speichern möchte, die ich gezeichnet habe.
Ich habe es so gemacht:
@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();
}
}
Der Weg, den ich gefunden habe, um PNG und Transparenz zu senden.
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")));
Erstellen Sie eine Video-Miniaturansicht für ein Video. Es kann Null zurückgeben, wenn das Video beschädigt ist oder das Format nicht unterstützt wird.
private void makeVideoPreview() {
Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND);
saveImage(thumbnail);
}
Um Ihre Bitmap in SD-Karte zu speichern, verwenden Sie den folgenden Code
Bild speichern
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());
}
}
So erhalten Sie den Pfad für die Bildspeicherung
/** 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;
}
Stellen Sie sicher, dass das Verzeichnis erstellt wurde, bevor Sie bitmap.compress
aufrufen:
new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
Nach Android 4.4 KitKat und ab 2017 ist der Anteil von Android 4.4 und darunter etwa 20% und sinkt. Es ist nicht möglich, die SD-Karte mithilfe der File
-Klasse und der getExternalStorageDirectory()
-Methode zu speichern. Diese Methode gibt den internen Speicher Ihres Geräts zurück und speichert Bilder, die für jede App sichtbar sind. Sie können Bilder auch nur privat in Ihrer App speichern und gelöscht werden, wenn der Benutzer Ihre App mit der openFileOutput()
-Methode löscht.
Ab Android 6.0 können Sie Ihre SD-Karte als internen Speicher formatieren, jedoch nur für Ihr Gerät. (Wenn Sie SD-Car als internen Speicher formatieren, kann nur Ihr Gerät auf den Inhalt zugreifen oder dessen Inhalt anzeigen) andere Antworten, aber wenn Sie eine entfernbare SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.
Sie sollten Storage Access Framework verwenden, um den URI in den Ordner onActivityResult
der Aktivitätsmethode zu setzen, um den vom Benutzer ausgewählten Ordner zu erhalten, und eine dauerhafte dauerhafte Berechtigung hinzufügen, um auf den Ordner zugreifen zu können, nachdem der Benutzer das Gerät neu gestartet hat.
@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);
}
}
}
}
Speichern Sie den Ordner "Speichern" nun in den gemeinsamen Einstellungen, damit der Benutzer nicht jedes Mal einen Ordner auswählen muss, wenn Sie ein Bild speichern möchten.
Sie sollten die DocumentFile
-Klasse verwenden, um Ihr Bild zu speichern, nicht File
oder ParcelFileDescriptor
. Weitere Informationen finden Sie in diesem Thread zum Speichern von Bildern auf der SD-Karte mit der compress(CompressFormat.JPEG, 100, out);
-Methode und den DocumentFile
-Klassen.
Sie möchten Bitmap in einem Verzeichnis Ihrer Wahl speichern. Ich habe eine Bibliothek ImageWorker erstellt, mit der der Benutzer Bitmaps/drawables/base64-Bilder laden, speichern und konvertieren kann.
Min. SDK - 14
Voraussetzung
Bitmap speichern/zeichnen/Base64
ImageWorker.to(context).
directory("ImageWorker").
subDirectory("SubDirectory").
setFileName("Image").
withExtension(Extension.PNG).
save(sourceBitmap,85)
Bitmap wird geladen
val bitmap: Bitmap? = ImageWorker.from(context).
directory("ImageWorker").
subDirectory("SubDirectory").
setFileName("Image").
withExtension(Extension.PNG).
load()
Implementierung
In Projektebene Gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
In Anwendungsebene Gradle
dependencies {
implementation 'com.github.1AboveAll:ImageWorker:0.51'
}
Weitere Informationen finden Sie unter https://github.com/1AboveAll/ImageWorker/blob/master/README.md
Hey, gib einfach den Namen .bmp
Mach das:
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**")
es hört sich so an, als würde es sich nur um die Welt drehen, aber probieren Sie es, sobald es in bmp foramt..Cheers gespeichert ist
Eigentlich keine Antwort, sondern ein Kommentar. Ich bin auf einem Mac, der die Emulatorumgebung ausführt, und erhalte eine Java.io.IOException: Berechtigung verweigert - Fehler mit diesem Code:
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();
}
}
}
Ich habe auch die Benutzungsberechtigung Android.permission.WRITE_EXTERNAL_STORAGE zur Manifestdatei hinzugefügt (wie von anderen angemerkt).
Bitmap ohne Komprimierung in Ihrer Galerie speichern.
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.");
}
}
Einige neue Geräte speichern keine Bitmap. Also habe ich etwas mehr erklärt.
stellen Sie sicher, dass Sie unter Permission hinzugefügt haben.
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
und erstellen Sie eine XML-Datei unter
xml
Ordnername provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
</paths>
und im AndroidManifest unter
<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>
dann einfach saveBitmapFile (passYourBitmapHere) aufrufen
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();
}
woher
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());
}
}
und andere Methoden
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;
}
und
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);
}