在KitKat之前(或在新Gallery之前)Intent.ACTION_GET_CONTENT返回这样的URI
内容://媒体/外部/图像/媒体/ 3951.
使用ContentResolver和quering
MediaStore.Images.Media.DATA返回文件URL.
但是在KitKat中,Gallery会返回一个URI(通过"Last"),如下所示:
内容://com.android.providers.media.documents/document/image:3951
我该如何处理?
android android-intent android-contentresolver android-gallery
我正在将一个位图加载到ImageView中,并看到此错误.我收集此限制与OpenGL硬件纹理(2048x2048)的大小限制有关.我需要加载的图像是大约4,000像素高的捏缩图像.
我试过关闭清单中的硬件加速,但没有快乐.
<application
android:hardwareAccelerated="false"
....
>
Run Code Online (Sandbox Code Playgroud)
是否可以将大于2048像素的图像加载到ImageView中?
许多应用程序允许共享从图库中挑选的图像.
他们上传原始图片文件吗?这是1-3 MB?或者他们处理?
在任何情况下,我如何从文件路径中获取图像,通过降低分辨率来减小其大小,并将其保存在其他地方并尝试上传?
我试过了:
Bitmap photo = decodeSampledBitmapFromFile(filePath, DESIRED_WIDTH,
DESIRED_HEIGHT);
FileOutputStream out = new FileOutputStream(filePath);
photo.compress(Bitmap.CompressFormat.JPEG, 100, out);
public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth,
int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
int inSampleSize = 1;
if (height > reqHeight) {
inSampleSize = Math.round((float) height / (float) reqHeight);
}
int expectedWidth = width / inSampleSize;
if (expectedWidth > reqWidth) …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
//choosed a picture
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == ImageHelper.SELECT_PICTURE) {
String picture = "";
Uri selectedImageUri = data.getData();
//OI FILE Manager
String filemanagerstring = selectedImageUri.getPath();
//MEDIA GALLERY
String selectedImagePath = ImageHelper.getPath(mycontext, selectedImageUri);
picture=(selectedImagePath!=null)?selectedImagePath:filemanagerstring;
Run Code Online (Sandbox Code Playgroud)
...
这只是一个图片选择器,来自画廊.这很不错,但是当我在一个imageview上打开这张照片时,带有相机的"PORTRAIT MODE"的图像看起来不错,但带有相机的"LANDSCAPE MODE"的图像在-90度开启.
我怎样才能将这些照片旋转回去?
Bitmap output = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Run Code Online (Sandbox Code Playgroud)
我试过这个:
Log.e("w h", bitmap.getWidth()+" "+bitmap.getHeight());
if (bitmap.getWidth()<bitmap.getHeight()) canvas.rotate(-90);
Run Code Online (Sandbox Code Playgroud)
但这不起作用,所有图像大小为:*2560 1920像素(PORTRAIT和LANDSCAPE模式全部)
如何旋转LANDSCAPE图片?
谢谢莱斯利
我有一堆图片网址.我必须下载这些图像并逐个显示在我的应用程序中.我正在使用SoftReferences和使用Sdcard 保存集合中的图像,以避免重新获取并改善用户体验.
问题是我对位图的大小一无所知.事实证明,当我使用BitmapFactory.decodeStream(InputStream)方法时,偶尔会出现OutOfMemoryExceptions .因此,我选择使用BitmapFactory Options(样本大小= 2)对图像进行下采样.这提供了更好的输出:没有OOM,但这会影响较小图像的质量.
我该如何处理这类案件?有没有办法选择性地仅对高分辨率图像进行下采样?
我已经包含了"通过myApp共享"选项.我在接收活动类中插入了以下代码.
// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();
// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
}
Run Code Online (Sandbox Code Playgroud)
检索位图图像的下一步是什么?
所以我得到了用户从SD卡中选择的图像的Uri图像.而且我想显示该图像的缩略图,因为很明显,图像可能很大并占据整个屏幕.谁知道怎么样?
如果我有一个通常会产生"内存不足"异常的大型位图文件,我该如何将其加载为tile?例如,我有10,000x10,000的图像,我想将其分成10x10网格的1,000x1,000像素图块.
我见过这个功能,Bitmap.createBitmap(sourceBitmap, x, y, width, height)但它需要我的大图像作为源输入.
如何在不完全加载输入图像的情况下从输入图像中获取图块?
我正在尝试从中检索图像Uri,首先我从图库中选择了图像,然后使用意图传递了imagePath并尝试Uri通过使用此代码获取图像-
Uri imgUri = Uri.parse(getIntent().getExtras().getString("imageUri"));
Log.d("" + imgUri, " here it is");
InputStream PIS;
try {
PIS = getContentResolver().openInputStream(imgUri);
mImage = BitmapFactory.decodeStream(PIS);
} catch (Exception e){
Log.d("go home you're drunk "+e,"");
Toast toast = Toast.makeText(this, ""+e, Toast.LENGTH_LONG);
toast.show();
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误
01-19 04:59:50.627 847-858/? I/ActivityManager: START u0 {cmp=pb.imagepicker/.CropActivity (has extras)} from uid 10060 on display 0
01-19 04:59:50.668 6072-6072/? D//storage/emulated/0/DCIM/Camera/IMG_20160118_124651.jpg: here it is
01-19 04:59:50.668 6072-6072/? D/go home you're drunk java.io.FileNotFoundException: No content provider: /storage/emulated/0?di[ 01-19 04:59:50.769 …Run Code Online (Sandbox Code Playgroud) 我已经看了一遍解决我的问题,似乎无法弄明白.我敢肯定它可能是1或2条简单的线条,希望有人可以引导我朝着正确的方向前进.
在我的应用中,用户可以单击将打开图库的按钮.一旦他们选择了图像,它就会在我的应用程序中的ImageView中显示该图像.那部分工作得非常好.最初,我只是从画廊返回一个uri,我会直接显示:
imageView1.setImageURI(myUri);
Run Code Online (Sandbox Code Playgroud)
好吧,显然我现在遇到了可怕的"Out Of Memory"错误,如果用户连续多次重新加载该页面,那么我必须清理我的代码以缩小图像.我通过实现一个位图类来实现这一点,该类将图像转换为位图并为我缩小位图.现在,我的ImageView显示代码如下所示:
imageView1.setImageBitmap(bitmap1);
Run Code Online (Sandbox Code Playgroud)
那部分工作正常.这是问题:
我将uri路径转换为字符串,然后将其保存在SharedPreference中.这样当用户退出应用程序并稍后返回时,它们自动显示的图像就会显示出来.我像这样转换uri:
...
selectedImageUri = data.getData();
String selectedImagePath;
selectedImagePath = getPath(selectedImageUri);
...
Run Code Online (Sandbox Code Playgroud)
检索SharedPreference字符串的旧方法,将其转换为uri,然后显示它工作正常.(当然,除了Out Of Memory错误)它看起来像这样:
Uri myUri = Uri.parse(selectedImagePath);
imageView1 = setImageURI(myUri);
Run Code Online (Sandbox Code Playgroud)
"selectedImagePath"显然是我从SharedPreference中检索到的String.再次,这工作正常,但如果重新加载太多次将抛出错误.
现在不工作的部分是当我尝试实现新的Bitmap转换时,我可以缩放位图而不会出现内存错误.这是代码:
Uri myUri = Uri.parse(selectedImagePath)
Bitmap bitmap = getThumbnail(myUri);
imageView1.setImageBitmap(bitmap);
Run Code Online (Sandbox Code Playgroud)
这没什么.原始图像选择显示图像正常但当我返回到此屏幕并尝试从SharedPreference解析字符串然后将其转换为位图时,什么都没有显示."getThumbnail"方法的代码直接来自THIS POST --->
这是第三个答案.
有人有主意吗?对不起,超长的帖子,但我宁愿解释我的问题,而不是提供足够的信息.对不起,如果在其他地方得到了回答.我一直在寻找其他问题几个小时,并没有找到解决我的问题的任何东西.
谢谢.
我正在制作一个图像过滤器应用程序,在应用过滤器之前,我将图像裁剪为正方形,我可以使用Soundcloud库像这样裁剪图像:-
private void beginCrop(String sources) {
img_name = "cropped"+System.currentTimeMillis();
Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped"+System.currentTimeMillis()));
Uri source = Uri.parse("file://"+sources);
Crop.of(source, destination).withAspect(200,200).start(this);
}
private void handleCrop(int resultCode, Intent result) {
if (resultCode == RESULT_OK) {
Toast.makeText(this,Crop.getOutput(result).toString(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(AlbumActivity.this,FilterImageActivity
.class);
intent.putExtra("output_image",Crop.getOutput(result).toString());
startActivity(intent);
} else if (resultCode == Crop.RESULT_ERROR) {
Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show();
}
}}
Run Code Online (Sandbox Code Playgroud)
以及下一个活动是FilterImageActivity.java:-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter_image);
String uri = getIntent().getStringExtra("output_image");
setImageDir(uri);
}
Run Code Online (Sandbox Code Playgroud)
和功能setImageDir():-
private void setImageDir(String uri)
{
Bitmap bitmap = …Run Code Online (Sandbox Code Playgroud) 我想在 android 11 的 ActivityResultCallback 中从 uri 创建一个文件。我用它uri.getPath()来将传入的 uri 转换为文件。但是,它在 android 11 中不起作用。这是我的代码:
private void launchGallery (){
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
launcherGallery.launch(intent);
}
ActivityResultLauncher<Intent> launcherGallery = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK) {
Intent data = result.getData();
if (data != null) {
Uri imageUri = data.getData();
// ---> getPath() won't work in android 11 <---
File file = new File(imageUri.getPath());
// I don't want to display the image in an ImageView.
// I …Run Code Online (Sandbox Code Playgroud) android ×12
bitmap ×5
java ×3
uri ×3
image ×2
android-11 ×1
crop ×1
file ×1
memory ×1
performance ×1
preference ×1
thumbnails ×1
upload ×1