Bitmap.createBitmap java.lang.IllegalArgumentException: width and height must be > 0 问题解决

本文详细介绍了如何通过设置转换矩形区域和检查旋转角度来解决在图片旋转过程中出现的java.lang.IllegalArgumentException错误。通过在旋转前判断角度是否大于0,可以避免错误发生。

写了一个把图片旋转的方法,但是报错,java.lang.IllegalArgumentException: width and height must be > 0 

设置转换矩形区域,旋转时要判断旋转角度是否大于0后,就不在报错了


public static  void setDirectionImage(Context mActivity,ImageView image,double lat_a, double lng_a, double lat_b, double lng_b){
				Bitmap bitmap=((BitmapDrawable) mActivity.getResources().getDrawable(R.drawable.img_direction_bloginfo)).getBitmap();
				Matrix matrix = new Matrix(); 
				Bitmap bp;
				RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());  
				matrix.setRectToRect(rect, rect, Matrix.ScaleToFit.CENTER);
				//设置图像的旋转角度              
				matrix.setRotate((float) gps2d( lng_a, lat_a,lng_b, lat_b));   
//				Log.i("info", "bitmap===="+"bitmap.getWidth():"+bitmap.getWidth()+" ;bitmap.getHeight():"+ bitmap.getHeight()+"matrix:"+gps2d( lng_a, lat_a,lng_b, lat_b));
					//旋转图像,并生成新的Bitmap对像
				bp=Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);          
					//重新在ImageView组件中显示旋转后的图像            
				image.setImageBitmap(bp);		
			}


/**
			 * 计算方位角pab。
			 * @param lat_a	A点的纬度
			 * @param lng_a	A点的经度
			 * @param lat_b	B点的纬度
			 * @param lng_b	B点的经度
			 * @return
			 */
		    public static  double gps2d(double lat_a, double lng_a, double lat_b, double lng_b) {
		    	if(lat_a==lat_b&&lng_a==lng_b){
		    		return 0;
		    	}
		       double d = 0;
		       lat_a=lat_a*Math.PI/180;
		       lng_a=lng_a*Math.PI/180;
		       lat_b=lat_b*Math.PI/180;
		       lng_b=lng_b*Math.PI/180;  
		        d=Math.sin(lat_a)*Math.sin(lat_b)+Math.cos(lat_a)*Math.cos(lat_b)*Math.cos(lng_b-lng_a);
		       d=Math.sqrt(1-d*d);
		       d=Math.cos(lat_b)*Math.sin(lng_b-lng_a)/d;
		       d=Math.asin(d)*180/Math.PI;   
		       return Math.abs(d);
		    }



FATAL EXCEPTION: main Process: com.mercusys.halo, PID: 31585 java.lang.IllegalArgumentException: width and height must be > 0 at android.graphics.Bitmap.createBitmap(Bitmap.java:1209) at android.graphics.Bitmap.createBitmap(Bitmap.java:1175) at android.graphics.Bitmap.createBitmap(Bitmap.java:1123) at android.graphics.Bitmap.createBitmap(Bitmap.java:1082) at com.tplink.mercusys.component.onboarding.view.EarthAnimationViewDelegate.initLine(EarthAnimationViewDelegate.kt:102) at com.tplink.mercusys.component.onboarding.view.EarthAnimationViewDelegate.access$initLine(EarthAnimationViewDelegate.kt:23) at com.tplink.mercusys.component.onboarding.view.EarthAnimationViewDelegate$initEarth$$inlined$addListener$default$1.onAnimationEnd(Animator.kt:141) at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:719) at android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda1.call(Unknown Source:4) at android.animation.Animator.callOnList(Animator.java:677) at android.animation.Animator.notifyListeners(Animator.java:616) at android.animation.Animator.notifyEndListeners(Animator.java:641) at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1306) at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1585) at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:328) at android.animation.AnimationHandler.-$$Nest$mdoAnimationFrame(Unknown Source:0) at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:86) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1542) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1553) at android.view.Choreographer.doCallbacks(Choreographer.java:1109) at android.view.Choreographer.doFrame(Choreographer.java:984) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1527) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:257) at android.os.Looper.loop(Looper.java:368) at android.app.ActivityThread.main(ActivityThread.java:8839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
05-11
package com.example.tapobulb import android.R.attr.text import android.content.res.ColorStateList import android.graphics.Color import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ClipDrawable import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView import android.widget.SeekBar import android.widget.TextView import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider import com.example.tapobulb.databinding.FragmentPresetBinding import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment /** * A simple [Fragment] subclass. * Use the [PresetFragment.newInstance] factory method to * create an instance of this fragment. */ class PresetFragment : BottomSheetDialogFragment() { private var _binding: FragmentPresetBinding? = null private val binding get() = _binding!! private val mainViewModel: MainViewModel by lazy { ViewModelProvider(requireActivity())[MainViewModel::class.java] } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentPresetBinding.inflate(inflater, container, false) val seekBar = binding.seekBar val txPercent = binding.lightPercent val temperatureSelect = binding.temperatureSelect val colorBar = binding.colorBar val colorTemperatureTextView = binding.colorTemperature val colorLight=binding.colorLight val whiteColor=binding.whiteLight val whiteGroup=binding.whiteGroup val colorValue=binding.colorValue val colorPickerView=binding.colorPickerView mainViewModel.brightnessPercent.observe(viewLifecycleOwner) { percent -> binding.seekBar.progress = percent binding.lightPercent.text = "$percent%" } colorLight.setOnClickListener { colorLight.backgroundTintList=ColorStateList.valueOf(ContextCompat.getColor(requireContext(),R.color.blue)) whiteColor.backgroundTintList= ColorStateList.valueOf(Color.TRANSPARENT) whiteGroup.visibility= View.GONE colorValue.visibility= View.VISIBLE colorPickerView.visibility= View.VISIBLE } whiteColor.setOnClickListener { whiteColor.backgroundTintList=ColorStateList.valueOf(ContextCompat.getColor(requireContext(),R.color.blue)) colorLight.backgroundTintList= ColorStateList.valueOf(Color.TRANSPARENT) whiteGroup.visibility= View.VISIBLE colorValue.visibility= View.GONE colorPickerView.visibility= View.GONE } colorPickerView.colorSelectedListener = { color -> val hexColor = String.format("#%06X", 0xFFFFFF and color) colorValue.text = hexColor colorValue.setTextColor(color) mainViewModel.selectColor(color) // 可选:设置背景颜色块 colorValue.setBackgroundColor(color) } // colorSelect.setOnTouchListener { _, event -> // if (event.action == MotionEvent.ACTION_DOWN || event.action == MotionEvent.ACTION_MOVE) { // val bitmap = (colorSelect.drawable as BitmapDrawable).bitmap // val x = event.x.toInt().coerceIn(0..bitmap.width) // val y = event.y.toInt().coerceIn(0..bitmap.height) // // val pixel = bitmap.getPixel(x, y) // val selectedColor = pixel // // // // 显示颜色值(可选) // val hexColor = String.format("#%06X", 0xFFFFFF and selectedColor) // colorValue.text = hexColor // colorValue.setTextColor(selectedColor) // } // true // } temperatureSelect.setOnTouchListener { view, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { view.parent?.requestDisallowInterceptTouchEvent(true) downY = event.rawY true } MotionEvent.ACTION_MOVE -> { val deltaY = event.rawY - downY val newY = view.y + deltaY val barTop = colorBar.top.toFloat() val barBottom = colorBar.bottom.toFloat() val selectHeight = view.height val clampedY = newY.coerceIn(barTop, barBottom - selectHeight) view.y = clampedY downY = event.rawY // 获取颜色 val color = getColorFromImageAtPosition(clampedY) // 更新颜色到 ViewModel 或 UI mainViewModel.selectColor(color) updateColorTemperature(clampedY, barTop, barBottom) true } MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> true else -> false } } seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { txPercent.text = "$progress%" mainViewModel.updateBrightness(progress) } override fun onStartTrackingTouch(seekBar: SeekBar?) {} override fun onStopTrackingTouch(seekBar: SeekBar?) {} }) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 禁止滑动 val behavior = (view.parent as? View)?.let { BottomSheetBehavior.from(it) } behavior?.isDraggable = false // 可选:设置为不可滑动时的状态(如完全展开) behavior?.state = BottomSheetBehavior.STATE_EXPANDED } private var downY: Float = 0f private fun updateColorTemperature(y: Float, barTop: Float, barBottom: Float) { val range = 6500 - 2700 val percentage = (y - barTop) / (barBottom - barTop) val colorTemp = 2700 + (range * percentage).toInt() binding.colorTemperature.text = "$colorTemp K" } private fun getColorFromImageAtPosition(y: Float): Int { val imageView = binding.colorBar // 你的图片视图 val bitmap = (imageView.drawable as? BitmapDrawable)?.bitmap ?: return Color.WHITE // 图片在屏幕上的位置 val imageTop = imageView.top val imageHeight = imageView.height // 滑块在图片上的 Y 坐标(相对于图片左上角) val relativeY = y - imageTop // 转换为 Bitmap 的像素坐标 val pixelY = (relativeY * bitmap.height / imageHeight.toFloat()).toInt() .coerceIn(0 until bitmap.height) // 获取颜色(假设你只取 Y 坐标,X 居中) val pixelX = bitmap.width / 2 // 居中取色 return bitmap.getPixel(pixelX, pixelY) } override fun onDestroyView() { super.onDestroyView() _binding = null } } 异常应该发生在colorPickerView这里,我设置了<com.example.tapobulb.view.ColorPickerView android:id="@+id/colorPickerView" android:layout_width="250dp" android:layout_height="250dp" android:src="@drawable/color_select" app:layout_constraintTop_toBottomOf="@+id/temperature_text" android:adjustViewBounds="false" android:layout_marginTop="40dp" android:visibility="gone" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/>目的是为了保证取色环在取边缘的时候不会发生显示不全的情况,但其实取色环的中心应该被设置为不可越界的,这种应该怎么办
最新发布
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值