Android遍历ARGB_8888 ByteArray旋转时遇数组越界异常
问题分析与解决
先看错误核心:异常触发在rotatedArray[destIndex](并非你误以为的outPutArray[srcIndex]),报错索引1229440超出数组长度1228800。结合打印的y:0,x:639,width:640可推算:
- 原图像尺寸是640×480(640×480×4=1228800,正好匹配ARGB_8888格式的数组长度)
- 你的
destX = width - y计算出640-0=640,但旋转90度后的图像宽度应为原高度480,640已经超出0~479的合法索引范围,最终导致destIndex=(639*480 +640)*4=1229440,直接越界。
错误根源
- 旋转坐标映射逻辑错误:顺时针转90度的坐标转换公式写错,导致目标索引超出数组范围。
- 索引校验不完整:只检查了源索引
srcIndex,完全没校验目标索引destIndex,且硬编码1228800的写法不通用,无法适配其他尺寸图像。
修复后的代码
private fun rotateByteArrayImage( outPutArray: ByteArray, rotatedArray: ByteArray, width: Int, height: Int ) { for (y in 0 until height) { for (x in 0 until width) { // 顺时针旋转90度的正确坐标映射: // 原像素(y, x) → 旋转后位于(destY, destX) = (x, height - 1 - y) val destX = height - 1 - y val destY = x val srcIndex = (y * width + x) * 4 val destIndex = (destY * height + destX) * 4 // 同时校验源、目标索引的合法性,确保通道访问不越界 if (srcIndex + 3 < outPutArray.size && destIndex + 3 < rotatedArray.size) { rotatedArray[destIndex] = outPutArray[srcIndex] rotatedArray[destIndex + 1] = outPutArray[srcIndex + 1] rotatedArray[destIndex + 2] = outPutArray[srcIndex + 2] rotatedArray[destIndex + 3] = outPutArray[srcIndex + 3] } } } }
关键说明
- 坐标转换修正:顺时针旋转90度时,原图像的第y行x列像素,会对应到旋转后图像的第x行、第
height-1-y列(本质是把原图像的列从下到上翻转后作为新图像的行)。 - 动态索引校验:用数组
size属性替代硬编码数值,适配所有尺寸图像;同时校验srcIndex+3和destIndex+3,避免访问ARGB四个通道时越界。 - 前置条件:调用方法前需确保
rotatedArray的长度为height*width*4(旋转后图像尺寸为height宽、width高)。
内容的提问来源于stack exchange,提问作者Akhil as
相关产品推荐
相关产品推荐

