bitmap一些属性

//第一种方式:从资源文件中得到图片 
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.haha); 
copyRawBitmap1=rawBitmap; 
copyRawBitmap2=rawBitmap; 
copyRawBitmap3=rawBitmap; 
//第二种方式:从SD卡中得到图片(方法1) 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+"/"+"haha.jpg"; 
Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null); 
//第二种方式:从SD卡中得到图片(方法2) 
InputStream inputStream=getBitmapInputStreamFromSDCard("haha.jpg"); 
Bitmap rawBitmap2 = BitmapFactory.decodeStream(inputStream); 


很详细的bitmap资料


//————>以下为将设置图片的圆角 
Bitmap roundCornerBitmap=this.toRoundCorner(rawBitmap, 40); 
imageView.setImageBitmap(roundCornerBitmap); 
//————>以上为将设置图片的圆角 

//————>以下为将图片高宽和的大小kB压缩 
// 得到图片原始的高宽 
int rawHeight = rawBitmap.getHeight(); 
int rawWidth = rawBitmap.getWidth(); 
// 设定图片新的高宽 
int newHeight = 500; 
int newWidth = 500; 
// 计算缩放因子 
float heightScale = ((float) newHeight) / rawHeight; 
float widthScale = ((float) newWidth) / rawWidth; 
// 新建立矩阵 
Matrix matrix = new Matrix(); 
matrix.postScale(heightScale, widthScale); 
// 设置图片的旋转角度 
//matrix.postRotate(-30); 
// 设置图片的倾斜 
//matrix.postSkew(0.1f, 0.1f); 
//将图片大小压缩 
//压缩后图片的宽和高以及kB大小均会变化 
Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth,rawWidth, matrix, true); 
// 将Bitmap转换为Drawable 
Drawable newBitmapDrawable = new BitmapDrawable(newBitmap); 
imageView.setImageDrawable(newBitmapDrawable); 
//然后将Bitmap保存到SDCard中,方便于原图片的比较 
this.compressAndSaveBitmapToSDCard(newBitmap, "xx100.jpg", 80); 
//问题: 
//原图大小为625x690 90.2kB 
//如果设置图片500x500 压缩后大小为171kB.即压缩后kB反而变大了. 
//原因是将:compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 
//第二个参数quality设置得有些大了(比如100). 
//常用的是80,刚设100太大了造成的. 
//————>以上为将图片高宽和的大小kB压缩 


//————>以下为将图片的kB压缩,宽高不变 
this.compressAndSaveBitmapToSDCard(copyRawBitmap1,"0011fa.jpg",80); 
//————>以上为将图片的kB压缩,宽高不变 

//————>以下为获取SD卡图片的缩略图方法1 
String SDCarePath1=Environment.getExternalStorageDirectory().toString(); 
String filePath1=SDCarePath1+"/"+"haha.jpg"; 
Bitmap bitmapThumbnail1=this.getBitmapThumbnail(filePath1); 
imageView.setImageBitmap(bitmapThumbnail1); 
//————>以上为获取SD卡图片的缩略图方法1 

//————>以下为获取SD卡图片的缩略图方法2 
String SDCarePath2=Environment.getExternalStorageDirectory().toString(); 
String filePath2=SDCarePath2+"/"+"haha.jpg"; 
Bitmap tempBitmap=BitmapFactory.decodeFile(filePath2); 
Bitmap bitmapThumbnail2=ThumbnailUtils.extractThumbnail(tempBitmap, 100, 100); 
imageView.setImageBitmap(bitmapThumbnail2); 
//————>以上为获取SD卡图片的缩略图方法2 

} 



//读取SD卡下的图片 
private InputStream getBitmapInputStreamFromSDCard(String fileName){ 
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+File.separator+fileName; 
File file=new File(filePath); 
try { 
FileInputStream fileInputStream=new FileInputStream(file); 
return fileInputStream; 
} catch (Exception e) { 
e.printStackTrace(); 
} 

} 
return null; 
} 




//获取SDCard的目录路径功能 
private String getSDCardPath() { 
String SDCardPath = null; 
// 判断SDCard是否存在 
boolean IsSDcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
if (IsSDcardExist) { 
SDCardPath = Environment.getExternalStorageDirectory().toString(); 
} 
return SDCardPath; 
} 
//压缩且保存图片到SDCard 
private void compressAndSaveBitmapToSDCard(Bitmap rawBitmap,String fileName,int quality){
String saveFilePaht=this.getSDCardPath()+File.separator+fileName; 
File saveFile=new File(saveFilePaht); 
if (!saveFile.exists()) { 
try { 
saveFile.createNewFile(); 
FileOutputStream fileOutputStream=new FileOutputStream(saveFile); 
if (fileOutputStream!=null) { 
//imageBitmap.compress(format, quality, stream); 
//把位图的压缩信息写入到一个指定的输出流中 
//第一个参数format为压缩的格式 
//第二个参数quality为图像压缩比的值,0-100.0 意味着小尺寸压缩,100意味着高质量压缩 
//第三个参数stream为输出流 
rawBitmap.compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 
} 
fileOutputStream.flush(); 
fileOutputStream.close(); 
} catch (IOException e) { 
e.printStackTrace(); 

} 
} 
} 




//获取图片的缩略图 
private Bitmap getBitmapThumbnail(String filePath){ 
BitmapFactory.Options options=new BitmapFactory.Options(); 
//true那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信息 
options.inJustDecodeBounds=true; 
//此时rawBitmap为null 
Bitmap rawBitmap = BitmapFactory.decodeFile(filePath, options); 
if (rawBitmap==null) { 
System.out.println("此时rawBitmap为null"); 
} 
//inSampleSize表示缩略图大小为原始图片大小的几分之一,若该值为3 
//则取出的缩略图的宽和高都是原始图片的1/3,图片大小就为原始大小的1/9 
//计算sampleSize 
int sampleSize=computeSampleSize(options, 150, 200*200); 
//为了读到图片,必须把options.inJustDecodeBounds设回false 
options.inJustDecodeBounds = false; 
options.inSampleSize = sampleSize; 
//原图大小为625x690 90.2kB 
//测试调用computeSampleSize(options, 100, 200*100); 
//得到sampleSize=8 
//得到宽和高位79和87 
//79*8=632 87*8=696 
Bitmap thumbnailBitmap=BitmapFactory.decodeFile(filePath, options); 
//保存到SD卡方便比较 
this.compressAndSaveBitmapToSDCard(thumbnailBitmap, "15.jpg", 80); 
return thumbnailBitmap; 
} 




//参考资料: 
//http://my.youkuaiyun.com/zljk000/code/detail/18212 
//第一个参数:原本Bitmap的options 
//第二个参数:希望生成的缩略图的宽高中的较小的值 
//第三个参数:希望生成的缩量图的总像素 
public static int computeSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels); 
int roundedSize; 
if (initialSize <= 8) { 
roundedSize = 1; 
while (roundedSize < initialSize) { 
roundedSize <<= 1; 
} 
} else { 
roundedSize = (initialSize + 7) / 8 * 8; 
} 
return roundedSize; 
} 

private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
//原始图片的宽 
double w = options.outWidth; 
//原始图片的高 
double h = options.outHeight; 
System.out.println("========== w="+w+",h="+h); 
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math 
.sqrt(w * h / maxNumOfPixels)); 
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( 
Math.floor(w / minSideLength), Math.floor(h / minSideLength)); 
if (upperBound < lowerBound) { 
// return the larger one when there is no overlapping zone. 
return lowerBound; 
} 
if ((maxNumOfPixels == -1) && (minSideLength == -1)) { 
return 1; 
} else if (minSideLength == -1) { 
return lowerBound; 
} else { 
return upperBound; 
} 
} 

/** 
* @param bitmap 需要修改的图片 
* @param pixels 圆角的弧度 
* @return 圆角图片 
*/ 
//参考资料: 
//http://blog.youkuaiyun.com/c8822882/article/details/6906768 
public Bitmap toRoundCorner(Bitmap bitmap, int pixels) { 
Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
Canvas canvas = new Canvas(roundCornerBitmap); 
int color = 0xff424242;//int color = 0xff424242; 
Paint paint = new Paint(); 
paint.setColor(color); 
//防止锯齿 
paint.setAntiAlias(true); 
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
RectF rectF = new RectF(rect); 
float roundPx = pixels; 
//相当于清屏 
canvas.drawARGB(0, 0, 0, 0); 
//先画了一个带圆角的矩形 
canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
//再把原来的bitmap画到现在的bitmap!!!注意这个理解 
canvas.drawBitmap(bitmap, rect, rect, paint); 
return roundCornerBitmap; 
} 

} 





package com.MangoMap; //import android.app.Activity; import com.google.android.maps.MapActivity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; //MapView Com import com.google.android.maps.MapView; import com.google.android.maps.MapController; import com.google.android.maps.GeoPoint; //import com.google.android.maps. public class MangoMap extends MapActivity { /** Called when the activity is first created. */ private MapView mpv; private MapController mpc; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //地图 mpv = (MapView) findViewById(R.id.map); mpv.setTraffic(true); mpv.setClickable(true); mpv.setScrollContainer(true); mpc = mpv.getController(); GeoPoint gp = new GeoPoint((int) (23.05320 * 1000000), (int) (113.155550 * 1000000)); //地理坐标 mpc.animateTo(gp); mpc.setZoom(15); //mpc. // } @Override protected boolean isRouteDisplayed() { return false; } } //----------------- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> --> <com.google.android.maps.MapView android:id="@+id/map" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="YOUR API key" /> <Button android:text="@+id/Button01" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> //--------------------- <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.MangoMap" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="com.google.android.maps" /> <activity android:name=".MangoMap" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest>
<think> 我们目前讨论的是Adobe Animate中使用ActionScript 3.0显示库中链接名为img1, img2, ..., img10的图片时出现的错误。 错误信息是“访问属性Bitmap未定义”。这意味着在尝试创建Bitmap对象时,ActionScript无法找到Bitmap类的定义。 可能的原因和解决方案: 1. 缺少导入:Bitmap类位于flash.display.Bitmap中。如果没有导入这个类,编译器将无法识别Bitmap。 解决方案:在代码开头添加导入语句:`import flash.display.Bitmap;` 2. 库中的链接类名设置问题:虽然链接标识符是img1, img2等,但当我们使用`getDefinitionByName`时,它要求这些链接标识符对应的类必须在当前作用域中可用(即已经导出到ActionScript)。如果库中的这些图片没有设置“导出为ActionScript”,那么`getDefinitionByName`将无法找到它们。 3. 使用BitmapData:如果库中的图片是位图,但链接类实际上是BitmapData类型(或者可能是其他类型),那么我们需要相应地调整代码。 4. 运行时加载:如果这些图片是在运行时加载的,那么我们需要确保在调用`getDefinitionByName`之前,这些图片已经被加载并注册到应用程序域中。 但是,根据问题描述,图片已经导入到库中并设置了链接名,所以问题可能集中在第1点和第2点。 因此,我提供以下步骤来解决: 步骤1:确保在代码中导入了Bitmap类。 步骤2:检查库中每个图片的链接属性: - 在库中右键单击每个图片,选择“属性”。 - 在“属性”对话框中,确保勾选了“为ActionScript导出”。 - “类”字段应该设置为对应的链接名(例如img1, img2等),并且基类应该是`flash.display.BitmapData`(注意:在Animate中,位图导出为ActionScript时,默认是BitmapData类,而不是Bitmap类。Bitmap是显示对象,而BitmapData是数据类)。 这里有一个关键点:当我们为库中的位图设置链接类时,它实际上是一个继承自BitmapData的类。但是,我们通常用这个BitmapData来创建Bitmap对象。然而,在链接类中,我们实际上得到的是一个BitmapData的类定义,而不是Bitmap。 因此,我们需要调整代码:首先获取BitmapData,然后用它来创建Bitmap。 示例代码调整如下: ```actionscript import flash.display.Bitmap; import flash.display.BitmapData; // 循环显示10张图片 for (var i:uint = 1; i <= 10; i++) { var linkName:String = "img" + i; // 获取BitmapData类 var bitmapDataClass:Class = getDefinitionByName(linkName) as Class; if (bitmapDataClass) { // 创建BitmapData实例 var bitmapData:BitmapData = new bitmapDataClass(0,0); // 注意:BitmapData的构造函数需要宽度和高度,但这里我们使用链接的位图,所以可以传入0,0,因为链接的位图数据已经包含宽高。 // 但实际上,链接的位图数据在实例化时不需要参数。所以可以这样: // 但是,注意:有些版本的Flash中,链接的BitmapData在实例化时可以不传参数,但有些需要。如果报错,可以尝试传递实际的宽高,或者查看文档。 // 更安全的方式:使用无参数构造,但需要确保链接类允许无参数构造。通常,库中位图导出的类允许无参数构造。 // 如果出现参数错误,可以尝试: // var bitmapData:BitmapData = new bitmapDataClass(); // 不传参数 // 如果上面传0,0不行,就换成不传参数。 // 然后创建Bitmap var image:Bitmap = new Bitmap(bitmapData); image.y = (i - 1) * image.height; addChild(image); } } ``` 但是,请注意:在Animate中,当我们为位图设置链接类时,默认基类是`flash.display.BitmapData`,并且它需要一个构造函数,该构造函数有两个参数(宽度和高度)。然而,链接的位图数据类在实例化时不需要指定实际的宽高,因为位图数据已经包含在类中。所以,我们可以传递0和0,或者传递位图实际的宽高(如果我们知道的话)。但更常见的做法是使用无参数构造函数,但默认情况下,导出的BitmapData类没有无参构造函数?这取决于Animate的版本。 另一种做法:在库中设置链接类时,将基类改为`flash.display.Bitmap`。这样,我们直接得到的就是Bitmap的子类,就可以直接用new来创建Bitmap实例(而不再需要BitmapData转换)。但是,这样设置后,链接类名对应的就是Bitmap类型。 我们可以选择其中一种方式。 方式一(推荐):保持库中链接设置不变(基类为BitmapData),然后按照上面的方式创建BitmapData,再包装成Bitmap。 方式二:修改库中每个位图链接的基类为`flash.display.Bitmap`,这样我们就可以直接创建Bitmap实例。但是,这样设置后,我们就不需要再使用BitmapData了。代码可以这样: ```actionscript import flash.display.Bitmap; for (var i:uint = 1; i <= 10; i++) { var linkName:String = "img" + i; var bitmapClass:Class = getDefinitionByName(linkName) as Class; if (bitmapClass) { var image:Bitmap = new bitmapClass() as Bitmap; image.y = (i - 1) * image.height; addChild(image); } } ``` 在方式二中,我们需要在库中设置每个位图的链接基类为`flash.display.Bitmap`。设置方法:在链接属性中,将“基类”从原来的`flash.display.BitmapData`改为`flash.display.Bitmap`。 总结:出现“访问属性Bitmap未定义”错误,首先检查是否导入了`flash.display.Bitmap`。其次,检查库中位图链接的基类设置,并根据基类的类型调整代码。 如果选择方式一(使用BitmapData作为基类),则代码中需要先创建BitmapData,再用它创建Bitmap。 如果选择方式二(使用Bitmap作为基类),则可以直接创建Bitmap实例。 根据引用[1]中的提示,有时需要转换类型。但在这里,我们更可能的是没有正确导入类或基类设置不对。 另外,引用[2]提到内存问题,虽然与当前问题不直接相关,但要注意如果图片很大,创建多个BitmapData或Bitmap可能会占用大量内存,需要妥善管理。 因此,我建议: 1. 导入Bitmap类:`import flash.display.Bitmap;` 2. 检查库设置,确定位图链接的基类。如果基类是BitmapData,则按照方式一的代码;如果基类是Bitmap,则按照方式二的代码。 通常,默认是BitmapData,所以方式一的代码更通用。但是,如果遇到需要无参数构造而实际需要两个参数的问题,可以尝试不传参数(即`new bitmapDataClass()`)或者传递任意两个整数(因为链接的BitmapData会忽略这两个参数,而使用嵌入的位图尺寸)。如果报错,可以尝试: ```actionscript var bitmapData:BitmapData = new bitmapDataClass(); // 不传参数 ``` 如果这种方式报错(提示没有无参构造函数),那么就必须传递两个整数,我们可以传递0,0,或者传递一个很大的值(但不要超过位图实际大小,否则会出错)。但是,实际上,链接的位图数据类在构造时,参数是被忽略的,所以传递0,0是安全的。 最终,我们选择方式一的代码,并确保传递0,0作为参数。 修正后的代码(方式一): ```actionscript import flash.display.Bitmap; import flash.display.BitmapData; for (var i:uint = 1; i <= 10; i++) { var linkName:String = "img" + i; var bitmapDataClass:Class = getDefinitionByName(linkName) as Class; if (bitmapDataClass) { // 创建BitmapData实例,传递0,0作为宽高(实际位图尺寸由嵌入的数据决定) var bitmapData:BitmapData = new bitmapDataClass(0,0); var image:Bitmap = new Bitmap(bitmapData); image.y = (i - 1) * image.height; addChild(image); } } ``` 如果上述代码仍然报错(比如提示参数数量不正确),可以尝试: ```actionscript var bitmapData:BitmapData = new bitmapDataClass(); ``` 另外,还有一个注意事项:`getDefinitionByName`函数要求链接类必须在当前域中已经定义。如果这些图片位于不同的SWF中,需要使用加载的方式。但这里假设它们都在同一个FLA的库中。 如果问题仍然存在,请检查链接类名是否确实为img1, img2等,并且没有拼写错误。 最后,如果图片很多,注意内存管理,使用完后及时释放内存(如引用[2]所述,调用`bitmapData.dispose()`),但这里我们只是展示,所以可能不需要立即释放。 希望这些步骤能解决“访问属性Bitmap未定义”的错误。 </think> 在Adobe Animate中使用链接名`img1`-`img10`的图片时,遇到"访问属性Bitmap未定义"错误,主要原因是Bitmap类未正确导入或链接设置问题。以下是详细解决方案: ### 解决方案 1. **导入Bitmap类**(核心修复) 在代码开头添加Bitmap类导入: ```actionscript import flash.display.Bitmap; // 必须导入Bitmap类 import flash.display.BitmapData; // 建议同时导入 for (var i:uint = 1; i <= 10; i++) { var linkName:String = "img" + i; // 其他代码保持不变... } ``` 2. **检查库中图片的链接设置** - 在库中右键点击每个图片 → 选择"属性" - 确保勾选"为ActionScript导出" - 检查"类"字段是否为正确的`img1`-`img10`(区分大小写) - 确认"基类"是`flash.display.BitmapData`(默认值) 3. **安全类型转换** 在创建实例时添加显式类型转换: ```actionscript var image:Bitmap = new imageClass() as Bitmap; // 添加as Bitmap转换 ``` ### 完整修正代码 ```actionscript import flash.display.Bitmap; import flash.display.BitmapData; for (var i:uint = 1; i <= 10; i++) { var linkName:String = "img" + i; var imageClass:Class = getDefinitionByName(linkName) as Class; if (imageClass) { var image:Bitmap = new imageClass() as Bitmap; // 显式类型转换 image.y = (i - 1) * image.height; addChild(image); // 内存管理建议(引用[2]) if(i == 10) image.bitmapData.dispose(); } } ``` ### 注意事项 1. **命名一致性**:确保链接名完全匹配(`img1`不是`Img1`) 2. **内存管理**:大量图片使用时,需通过`bitmapData.dispose()`释放内存(引用[2]) 3. **作用域问题**:确保代码在帧脚本或文档类中执行 4. **发布设置**:在"文件→发布设置"中确认ActionScript版本为3.0 > 关键点:Flash中库位图默认导出为BitmapData类型,需要显式转换为Bitmap显示对象[^1]。当图片使用完毕后,应及时调用`dispose()`释放内存避免溢出[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值