我正在尝试缩小位图.简而言之,图像最初来自宽度为4016的ByteArray.在使用工厂选项缩小图像后,它仍会报告宽度为4016的图像.
这是我的代码的两个剪辑:
Bitmap myBitmap = null;
@Override
protected byte[] doInBackground(Object... params) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
if (options.outHeight > options.outWidth) {
options.inSampleSize = calculateInSampleSize(options, 640, 960);
} else {
options.inSampleSize = calculateInSampleSize(options, 960, 640);
}
options.inJustDecodeBounds = false;
//myImageByteArray is 4016 wide
myBitmap = BitmapFactory.decodeByteArray(myImageByteArray, 0, myImageByteArray.length, options);
//This log statement outputs 4016!!! Shouldn't it be smaller since I just decoded the byteArray with options?
Log.d("bitmap", myBitmap.getWidth()+"");
}
public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int …Run Code Online (Sandbox Code Playgroud) 有时,特别是在我的应用程序中实现新功能时,我使用DDMS + HPROF来分析内存和堆使用.由于应用程序似乎没有任何性能 - ANR问题,一切顺利,最初我并不关心它 - 但现在,因为我看到它几乎总是相同的大小,我想知道该死的是什么是.
每次运行HPROF时,都会检查Leak suspects选项卡.总有一个android.graphics.Bitmap实例占用了所有已用堆的大约25%.

我想进一步了解那是什么,所以我打开了支配树,看到了这个:

所以基本上有一个巨大的byte[]实例保留了大量的堆,并且从未被释放.根据这个,我复制了byte[]它的值,将它转储到一个.data文件中,用Gimp打开,结果如下:

所以基本上,它看起来像PNG图像的"alpha(0)"部分.考虑以下事实:
byte[]始终与应用程序的开始大致相同(4个月前)drawabledrawable-xxxbyte[]android.graphics.Bitmap任何人都知道它是什么byte[]以及我是否应该做任何事情来解放它?
任何帮助赞赏!
我写了一些代码,可以将tablelayout转换为bitmap.everythink工作完美但是,我的位图有黑色背景这是我的源代码
public Bitmap sendMyData(TableLayout view) {
Bitmap bitmap = null;
ByteArrayOutputStream bbb = new ByteArrayOutputStream();
view.setDrawingCacheEnabled(true);
view.layout(0, 0, view.getWidth(), view.getHeight());
view.buildDrawingCache(true);
bitmap = Bitmap.createBitmap(view.getDrawingCache());
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bbb);
view.setDrawingCacheEnabled(false);
return bitmap;
}
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?为什么我的位图有黑色背景?如果有人知道解决方案,请帮助我谢谢
我正在使用matrix.setPolyToPoly函数将位图的选定区域(4个角)转换为矩形,通常它工作得很棒.但在下一个例子中:

polyToPoly函数未通过透视变换:

我画了两行进行测试,这些线标记了我想要四个选定点的位置.
我做错了什么?谢谢!
编辑:我已经使用canvas.drawBitmapMesh解决了问题,感谢pskink的建议!!
这是最终的代码
private float[] generateVertices(int widthBitmap, int heightBitmap) {
float[] vertices=new float[(WIDTH_BLOCK+1)*(HEIGHT_BLOCK+1)*2];
float widthBlock = (float)widthBitmap/WIDTH_BLOCK;
float heightBlock = (float)heightBitmap/HEIGHT_BLOCK;
for(int i=0;i<=HEIGHT_BLOCK;i++)
for(int j=0;j<=WIDTH_BLOCK;j++) {
vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)] = j * widthBlock;
vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)+1] = i * heightBlock;
}
return vertices;
}
private Bitmap perspectiveTransformation(Bitmap bitmap, ArrayList<Point> bitmapPoints) {
Bitmap correctedBitmap;
int maxX = (int) Math.max(Math.abs(bitmapPoints.get(0).x - bitmapPoints.get(1).x), Math.abs(bitmapPoints.get(2).x - bitmapPoints.get(3).x));
int maxY = (int) Math.max(Math.abs(bitmapPoints.get(0).y - bitmapPoints.get(3).y), …Run Code Online (Sandbox Code Playgroud) 我找到了这个链接,说明我如何在我的身上发光效果ImageButton.因此,只要用户按下ImageButton该onTouchEvent()功能被称为有我所说的setImageBitmap()功能.问题是这个函数(setImageBitmap())似乎根本没有效果.
什么有效:
1)到目前为止,我扩展ImageButton如下
// Pen.java
public class Pen extends ImageButton {
public Pen(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("Now I am setting Pen");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在Activity I中创建Pen(自定义ImageButton)实例,从实例定义setGlow()和调用.setImageBitmap()Pen
//MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Pen myImgbutton;
myImgbutton = (Pen) findViewById(R.id.pen); …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的布局与ImageView.我的应用程序打开相机,保存图像,然后在ImageView中显示图像BitmapFactory.decodeFile.唯一的问题是它是旋转的.我理解a)这是由于手机的相机默认为横向,所以这需要在代码中处理,b)图像处理必须在与UI的单独线程中完成.
Android培训文档似乎适用于从资源ID而不是文件路径加载图像.这只会让事情变得棘手,因为我能够按照教程进行操作,但最终难以协调差异.
我当然是新手,所以如果有人能够给我一个高层次的概述,为了实现这个目标需要做些什么,我真的很感激.以下代码是我正在将位图添加到ImageView的位置.我假设我对单独线程的调用会进入onCreate?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_image);
Bitmap bm = BitmapFactory.decodeFile(MainActivity.image_path);
displayImageView = (ImageView) findViewById(R.id.myImageView);
displayImageView.setImageBitmap(bm);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试从我的Environment.getExternalStorageDirectory()加载屏幕截图并尝试将其转换为位图
public void onPictureTaken(String path) throws IOException {
String photoPath = filepath + "/" + path;; //UPDATE WITH YOUR OWN JPG FILE
File directory = new File (filepath);
File file = new File(directory, path);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(photoPath, options);
// Calculate inSampleSize
options.inSampleSize = 4;
options.inJustDecodeBounds = false;
BitmapFactory.decodeFile(photoPath, options);
}
Run Code Online (Sandbox Code Playgroud)
--- SkImageDecoder :: Factory返回null
这是我调用onPictureTaken的函数:
private void observeSceenshot(){
filepath = Environment.getExternalStorageDirectory()
+ File.separator + Environment.DIRECTORY_PICTURES
+ File.separator + "Screenshots";
Log.d(TAG, filepath);
FileObserver fileObserver …Run Code Online (Sandbox Code Playgroud) 我有一个小问题.需要朝着正确的方向轻推.我正在做像Vine和/或Instagram的视频编辑器.他们在视频中显示带有屏幕截图的时间线

它只是根据视频持续时间添加更多图片.我为我的应用程序做的是我添加了recyclerView.此recyclerview有一个适配器,每次在onBindViewHolder上调用以下函数
public Bitmap getFrameFromCurrentVideo(int seconds) {
Bitmap bitmap = null;
if(mMediaMetadataRetriever != null) {
bitmap = mMediaMetadataRetriever.getFrameAtTime(seconds * 1000000, MediaMetadataRetriever.OPTION_CLOSEST);
}
return bitmap;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,它添加了我想要的适当数量的图像.但问题是它在UI线程上太沉重了.由于recyclerView回收所有东西.它每次必须得到一个帧时就会滞后.
所以我认为我必须做一些异步任务,然后缓存图像.但我读到的是,AsyncTask不建议用于回收站视图,因为它可以循环使用.
那么我应该怎样做才能提高性能呢?有什么好主意吗?
我想保存图像而不压缩它,并希望以原始形式保存它,即当图像被压缩时,图像尺寸会减小并且图像变小。我为此目的使用本机相机。我正在工作android studio。我正在制作一个应用程序,在其中使用相机来保存图像。但图像经过压缩,非常小,质量也很低。
下面是我保存图像的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
{
if(resultCode == Activity.RESULT_OK)
{
Bitmap bmp = (Bitmap)data.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
// convert byte array to Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
if(isStoragePermissionGranted())
{
SaveImage(bitmap);
}
}
}else {
switch (requestCode) {
case 1000:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made …Run Code Online (Sandbox Code Playgroud) java.lang.SecurityException:权限拒绝:从 ProcessRecord{932688f 12849:mobi.hubbler.app/u0a158} (pid=12849,uid=10158) 打开未从 uid 10034 导出的提供程序 com.miui.gallery.provider.GalleryOpenProvider
InputStream is = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
is = context.getContentResolver().openInputStream(bitmapUri);
BitmapFactory.decodeStream(is, null, options);
Run Code Online (Sandbox Code Playgroud)
尝试从 uri 获取位图。此问题仅发生在 MI(小米)设备上。
android ×10
android-bitmap ×10
bitmap ×3
java ×2
bitmapimage ×1
ddms ×1
hprof ×1
image ×1
inputstream ×1
matrix ×1
memory-leaks ×1
perspective ×1
xiaomi ×1