비트맵을 위치에 저장
저는 웹 서버에서 이미지를 다운로드하여 화면에 표시하고, 사용자가 이미지를 유지하기를 원할 경우 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)
압축률이 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());
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와 같은 일부 형식은 품질 설정을 무시합니다.
다음은 비트맵을 파일에 저장하기 위한 샘플 코드입니다.
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)
;
당신에게 도움이 되길 바랍니다.행복한 코딩 생활.
나는 이 질문이 오래되었다는 것을 알지만, 이제 우리는 그것 없이도 같은 결과를 얻을 수 있습니다.WRITE_EXTERNAL_STORAGE
공급자를 할 수 .대신 파일 공급자를 사용할 수 있습니다.
private fun storeBitmap(bitmap: Bitmap, file: File){
requireContext().getUriForFile(file)?.run {
requireContext().contentResolver.openOutputStream(this)?.run {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, this)
close()
}
}
}
공급자로부터 파일을 검색하는 방법은 무엇입니까?
fun Context.getUriForFile(file: File): Uri? {
return FileProvider.getUriForFile(
this,
"$packageName.fileprovider",
file
)
}
또한등는것잊마오십시지을하를 하는 것을 잊지 마세요.provider
manifest
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
전화해 보는 게 어때요?Bitmap.compress
100이 있는 방법(무손실인 것처럼 들리는 방법)?
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) {
}
저는 또한 사진을 저장하고 싶습니다.하지만 제 문제(?)는 제가 그린 비트맵에서 저장하고 싶다는 것입니다.
저는 이렇게 만들었습니다.
@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 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.");
}
}
비트맵을 선택한 디렉토리에 저장하려고 합니다.저는 사용자가 비트맵/도면/base64 이미지를 로드, 저장 및 변환할 수 있는 라이브러리 ImageWorker를 만들었습니다.
최소 SDK - 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 에서 더 많은 것을 읽을 수 있습니다.
호출하기 전에 디렉토리가 작성되었는지 확인합니다.bitmap.compress
:
new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
비디오의 비디오 미리 보기를 만듭니다.비디오가 손상되었거나 형식이 지원되지 않는 경우 null을 반환할 수 있습니다.
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;
}
어떤 새로운 기기들은 비트맵을 저장하지 않기 때문에 제가 조금 더 설명했습니다.
권한 아래에 추가했는지 확인합니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
아래에 xml 파일을 만듭니다.
xml
폴더 이름 공급자_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
</paths>
And Android Manifest의 아래에
<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을 호출합니다(여기서 당신의 Bitmap 전달).
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);
}
이봐요, 그냥 이름을 .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에 저장되면 시도해 보세요.건배.
Android 4.4 Kitkat 이후 및 2017년 기준 Android 4.4 이하의 점유율이 약 20% 이상 감소하고 있으며, 다음을 사용하여 SD 카드에 저장할 수 없습니다.File
클래스와getExternalStorageDirectory()
방법.이 방법은 모든 앱에서 볼 수 있는 장치 내부 메모리 및 이미지 저장을 반환합니다.또한 사용자가 앱을 삭제할 때 삭제될 이미지만 앱에 저장할 수 있습니다.openFileOutput()
방법.
Android 6.0부터는 SD 카드를 내장 메모리로 포맷할 수 있지만 장치에 대해서만 전용으로 포맷할 수 있습니다.(SD 차량을 내장 메모리로 포맷하면 장치만 액세스하거나 해당 내용을 볼 수 있습니다.) 다른 대답을 사용하여 해당 SD 카드에 저장할 수 있지만, 이동식 SD 카드를 사용하려면 아래의 내 대답을 읽어야 합니다.
스토리지 액세스 프레임워크를 사용하여 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
더 많은 정보를 위해 당신은 SD 카드에 이미지를 저장하기 위해 이 스레드를 확인할 수 있습니다.compress(CompressFormat.JPEG, 100, out);
및 방법DocumentFile
반.
|==| 비트맵에서 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);
}
언급URL : https://stackoverflow.com/questions/649154/save-bitmap-to-location
'UFO ET IT' 카테고리의 다른 글
문자열에 숫자가 포함되어 있는지 탐지하는 방법은 무엇입니까? (0) | 2023.06.22 |
---|---|
Node.js의 Express.js에서 GET(쿼리 문자열) 변수를 가져오는 방법은 무엇입니까? (0) | 2023.06.02 |
UITableView 로드 종료를 감지하는 방법 (0) | 2023.06.02 |
div 내부에서 이미지를 수직으로 정렬하는 방법 (0) | 2023.06.02 |
UITableViewCell 내부의 버튼 클릭 (0) | 2023.06.02 |