Ⅰ 什麼是9png圖片 原理是什麼,9png工具又如何使用
9png圖片它是android系統特有的一種圖片格式,文件擴展名為.9.PNG。
9png的原理:其實相當於把一張png圖分成了9個部分(九宮格),分別為4個角,4條邊,以及一個中間區域,4個角是不做拉升的,所以還能一直保持圓角的清晰狀態,而2條水平邊和垂直邊分別只做水平和垂直拉伸,所以不會出現邊緣。
如何操作:滑鼠左鍵選取需要拉伸的像素點;shift+滑鼠左鍵取消當前像素點。
從圖中可以看出,導入的png圖片默認周圍多了一像素點,也就是這一圈一像素點就是可操作區域。因為下方和右方可操作區域是指定內容的顯示區域,屬於可選區域,可不予理會;但是要注意內容區域的標記不能有間斷,否則.9.png圖片在放入項目下會報錯。
注意上方和左邊的黑色像素,是想讓此png圖像拉伸操作的時候,只是中間區域被拉伸。選擇上方中間區域是為了橫向拉伸的時候選取的拉伸像素點,左邊則是縱向拉伸像素點。
在Android的設計過程中,為了適配不同的手機解析度,圖片大多需要拉伸或者壓縮,這樣就出現了可以任意調整大小的一種圖片格式「.9.png」。
這種圖片是用於Android開發的一種特殊的圖片格式,它的好處在於可以用簡單的方式把一張圖片中哪些區域可以拉伸,哪些區域不可以拉伸設定好,同時可以把顯示內容區域的位置標示清楚。
Ⅱ android開發 android drawable-hdpi文件的圖片會放大也會縮小
hdpi的dp和像素比是1:1.5,就是說1個dp表示1.5像素,而1280-800的屏幕精細度是xhdpi,1dp表示2像素,這樣就形成了一個3:4的比例
你看560/420 = 4/3 283/212 = 4/3
320*480的屏幕精細度是mdpi,dp和像素比是1,就是xhdpi的一半,所以圖片的長寬像素都變成一半了,即560*283和280*141,就是這樣子。
Ⅲ android系統上格式為RGBA8888的PNG圖,載入後佔用多少運存空間呢
PNG都是壓縮圖,讀入內存的話,佔用的與文件大小相同,應該不會展開成為點陣圖,頂多是在繪制的時候又解壓縮之類
理論上,不壓縮的點陣圖加上透明度,文件大小為
圖片寬×圖片高×(8+8+8+8)/ 8
以上是我認為的
Ⅳ android中該如何設置一張png圖片的大小
android doc中是這樣描述的:
public void setImageResource (int resId)
這是其中的一個方法,參數resld是這樣:
ImageView.setImageResource(R.drawable.icon);
看下面這段話
Sets a drawable as the content of this ImageView.
This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider usingsetImageDrawable(Drawable) or setImageBitmap(Bitmap) and BitmapFactory instead.
此函數使用UI線程,可以用下面3種替代:
ImageView iv;
String fileName = "/data/data/com.test/aa.png;
Bitmap bm = BitmapFactory.decodeFile(fileName);
iv.setImageBitmap(bm);
ImageView iv = new ImageView(context);
iv.setImageResource(iv[position]);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setLayoutParams(new Gallery.LayoutParams(136,88));
mImageView = (ImageView)this.findViewById(R.id.myImageView1);
mImageView.setImageDrawable(getResources().getDrawable(R.drawable.right)
Ⅳ android 如何壓縮png圖片位元組數
如果你只是覺得程序背景圖片大的話 這個應該是美工的問題 找個專業的美工設計下就Ok的
如果是程序中想壓縮圖片的話 網上的方法很多
下面代碼是將圖片按比例大小壓縮方法(根據Bitmap圖片壓縮)
java">privateBitmapcomp(Bitmapimage){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100,baos);
if(baos.toByteArray().length/1024>1024){//判斷如果圖片大於1M,進行壓縮避免在生成圖片(BitmapFactory.decodeStream)時溢出
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG,50,baos);//這里壓縮50%,把壓縮後的數據存放到baos中
}
ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());
BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
//開始讀入圖片,此時把options.inJustDecodeBounds設回true了
newOpts.inJustDecodeBounds=true;
Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
newOpts.inJustDecodeBounds=false;
intw=newOpts.outWidth;
inth=newOpts.outHeight;
//現在主流手機比較多是800*480解析度,所以高和寬我們設置為
floathh=800f;//這里設置高度為800f
floatww=480f;//這里設置寬度為480f
//縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
intbe=1;//be=1表示不縮放
if(w>h&&w>ww){//如果寬度大的話根據寬度固定大小縮放
be=(int)(newOpts.outWidth/ww);
}elseif(w<h&&h>hh){//如果高度高的話根據寬度固定大小縮放
be=(int)(newOpts.outHeight/hh);
}
if(be<=0)
be=1;
newOpts.inSampleSize=be;//設置縮放比例
newOpts.inPreferredConfig=Config.RGB_565;//降低圖片從ARGB888到RGB565
//重新讀入圖片,注意此時已經把options.inJustDecodeBounds設回false了
isBm=newByteArrayInputStream(baos.toByteArray());
bitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
returncompressImage(bitmap);//壓縮好比例大小後再進行質量壓縮
}
【ps:看你自己的需要吧 給個地方做參考 http://my.eoe.cn/isnull/archive/564.html 你也可以搜索下 其他的方法 】
Ⅵ Android中壓縮圖片指定大小
注意看這句話,bit.compress(CompressFormat.PNG, 100, baos);
那裡的數字表示 如果不壓縮是100,表示壓縮率為0。
如果是70,就表示壓縮率是70,表示壓縮30%;
所以你的倒數第二句話表示沒有壓縮。
以下是我壓縮的方法,望採納。
/**
* 圖像壓縮並保存到本地
* 返回處理過的圖片
*
*/
private Bitmap
saveImage(String fileName,Bitmap bit) {
File file = new
File(fileName);
if (!file.exists()) {
try
{
file.createNewFile();
} catch (IOException e)
{
e.printStackTrace();
}
}
try
{
ByteArrayOutputStream stream = new
ByteArrayOutputStream();
bit.compress(CompressFormat.JPEG, 70,
stream);
// 70 是壓縮率,表示壓縮30%; 如果不壓縮是100,表示壓縮率為0
FileOutputStream os =
new
FileOutputStream(file);
os.write(stream.toByteArray());
os.close();
return
bit;
} catch (Exception e) {
file = null;
return
null;
}
}
Ⅶ 請問大家有誰知道可以壓縮圖片(使圖片佔用內存變小)的安卓版免費的軟體
網路流通的99.9%的圖片都是高度壓縮的png,jpg等格式,再次使用壓縮軟體壓縮這類圖片沒有意義,縮小體積比率極小。安卓平台的壓縮軟體,很多主流手機品牌自帶的文件管理器是集成了壓縮解壓功能的。將你打算壓縮的一堆文件放進一個文件夾,選定這個文件夾,詳情里就有壓縮選項,如下圖,如果手機品牌小眾,沒有自帶的壓縮解壓工具,可以考慮PC平台知名軟體的安卓版,比如rar for 安卓:
Ⅷ 安卓解壓縮加密軟體哪個好
360手機助手裡直接搜索「安卓解壓縮」軟體,款可創建ZIP, RAR, 7Zip, BZip2壓縮文件,可解壓ZIP, JAR, APK, WAR, EAR, TAR, GZIP壓縮文件的超強工具.軟體功能:-支持內建程序管理及進程管理,可備份程序(非Private)到存儲卡-支持可解壓壓縮大小64 kb, 1MB, 2MB, 3MB, 4MB, 6MB的7Z文件.甚至可以解壓更大的7Z文件,但是過大的壓縮文件可能導致程序意外終止甚至系統崩潰. 請創建7Z時注意大小.-支持可打開256-bit AES加密的ZIP.-支持可創建 ZIP, RAR, 7Zip, BZip2壓縮文件,可解壓ZIP, JAR, APK, WAR, EAR, TAR, GZIP壓縮文件.-支持可以快速查看ZIP和RAR文件中的內容並可以選擇文件解壓.-支持菜單鍵可快速打開(like jpg, png, txt, xml, html...) , 管理文件/文件夾發送mail, 重命名, 移動, 復制, 刪除-支持AES256加密方式加密解壓縮ZIP文件(兼容WinZip)-支持APP2SD功能(支持安裝到SD卡上)提醒:此軟體似乎不支持中文文件解壓和壓縮.請大家盡量把文件夾和文件改成英文.
Ⅸ android 圖片質量壓縮和尺寸壓縮有什麼區別
這個方法用來將特定格式的壓縮圖片寫入輸出流(OutputStream)中,當然例如輸出流與文件聯系在一起,壓縮後的圖片也就是一個文件。如果壓縮成功則返回true,其中有三個參數:
format是壓縮後的圖片的格式,可取值:Bitmap.CompressFormat .JPEG、~.PNG、~.WEBP。
quality的取值范圍為[0,100],值越小,經過壓縮後圖片失真越嚴重,當然圖片文件也會越小。(PNG格式的圖片會忽略這個值的設定)
stream指定壓縮的圖片輸出的地方,比如某文件。
上述方法還有一個值得注意的地方是:當用BitmapFactory decode文件時可能返回一個跟原圖片不同位深的圖片,或者丟失了每個像素的透明值(alpha),比如說,JPEG格式的圖片僅僅支持不透明的像素。文章android圖片壓縮在文末提到的下面這點可能就是這個原因:
當調用bitmap.compress(CompressFormat.JPEG, 100, fos);保存為圖片時發現圖片背景為黑色,如下圖:
下面是質量壓縮的代碼:
(Bitmapbmp,Filefile){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
intoptions=80;//個人喜歡從80開始,
bmp.compress(Bitmap.CompressFormat.JPEG,options,baos);
while(baos.toByteArray().length/1024>100){
baos.reset();
options-=10;
bmp.compress(Bitmap.CompressFormat.JPEG,options,baos);
}
try{
FileOutputStreamfos=newFileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
}catch(Exceptione){
e.printStackTrace();
}
}
這段代碼來自Android圖片壓縮總結,我根據自己的需求改了改,但是大同小異,所以就直接貼了。
隨著代碼中的option逐漸變小,我們可以在logcat中列印baos的大小來查看圖片的大小。我們也可以去掉while的循環條件,一直壓縮下去看效果,最終一張照片可能就由原來的3、4M變成了幾百K甚至幾百B了。我在試的過程中將option設置成100,壓縮後偶爾會出現一張3、4M的圖片經過壓縮後竟變成了6、7M,這里還是有點困惑,不知道為什麼。
隨後,我想把這個壓縮後的圖片(1、200KB)填充到ImageView中時卻失敗了,logcat中提示圖片過大!這就是文章開頭提到的問題,雖然我們通過質量壓縮使File形式的圖片文件縮小了,但是並沒有改變圖片的寬高,原先是1080*1920解析度的圖片經壓縮後還是1080*1920,而File格式轉換成Bitmap格式進入到內存中時,內存是根據圖片的像素數量來給圖片分配內存大小的,還是有好幾M,因此填充ImageView失敗。
順便提一下,可以用bitmap.getByteCount()獲取存儲bitmap像素的內存大小,但是KITKAT(Android 4.4版本)以後用getAllocateByteCount()獲取。一般情況下,後者返回值比前者大,比如,當bitmap被重用去decode另外更小的bitmaps時,或者被人為地配置一下屬性值,比如setWidth()、setHeight()、reconfigure()時,如果bitmap不做以上操作,二者的返回值應該是一樣的。(譯文,不太懂)
二、尺寸壓縮
特點: 通過設置采樣率, 減少圖片的像素, 達到對內存中的Bitmap進行壓縮
我們主要通過BitmapFactory中的decodeFile方法對圖片進行尺寸壓縮:
publicstaticBitmapdecodeFile(StringpathName,BitmapFactory.Optionsopts)
public static Bitmap decodeFile (String pathName, BitmapFactory.Options opts)
其中有兩個參數:
pathName是圖片文件的路徑。
opts 就是所謂的采樣率,它里邊有很多屬性可以設置,我們通過設置屬性來達到根據自己的需要,壓縮出指定的圖片。其中比較常用的屬性有:
booleaninJustDecodeBounds—— 如果設置為true,則只讀取bitmap的寬高,而忽略內容。
intinSampleSize—— 如果>1,調用decodeFile方法後,就會得到一個更小的bitmap對象(已壓縮)。比如設置為2,那麼新Bitmap的寬高都會是原Bitmap寬高的1/2,總體大小自然就是原來的1/4了,以此類推。
booleaninPurgeable—— 如果設置為true,壓縮後的圖片像素占的內存將會在系統清理內存的時候被回收掉,當像素的信息再次被用到時將會自動重新decode該像素(比如getPixels()時)。(慎用!重復decode可以會造成UI的卡頓,API level 21 已棄用)
booleaninInputShareable—— 與inPurgeable配合使用,如果inPurgeable設置成false,自動忽略此值,如果inPurgeable為true,此值決定是否該bitmap能分享引用給輸入數據(inputstream,array等),或者必須進行深拷貝。API level 21 已棄用。(這是譯文,不太理解!!!)
下面是一段實現的代碼
privateBitmapsizeCompres(Stringpath,intrqsW,intrqsH){
//用option設置返回的bitmap對象的一些屬性參數
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;//設置僅讀取Bitmap的寬高而不讀取內容
BitmapFactory.decodeFile(path,options);//獲取到圖片的寬高,放在option里邊
finalintheight=options.outHeight;//圖片的高度放在option里的outHeight屬性中
finalintwidth=options.outWidth;
intinSampleSize=1;
if(rqsW==0||rqsH==0){
options.inSampleSize=1;
}elseif(height>rqsH||width>rqsW){
finalintheightRatio=Math.round((float)height/(float)rqsH);
finalintwidthRatio=Math.round((float)width/(float)rqsW);
inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;
options.inSampleSize=inSampleSize;
}
returnBitmapFactory.decodeFile(path,options);//主要通過option里的inSampleSize對原圖片進行按比例壓縮
}
private Bitmap sizeCompres(String path, int rqsW, int rqsH) {
// 用option設置返回的bitmap對象的一些屬性參數
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;// 設置僅讀取Bitmap的寬高而不讀取內容
BitmapFactory.decodeFile(path, options);// 獲取到圖片的寬高,放在option里邊
final int height = options.outHeight;//圖片的高度放在option里的outHeight屬性中
final int width = options.outWidth;
int inSampleSize = 1;
if (rqsW == 0 || rqsH == 0) {
options.inSampleSize = 1;
} else if (height > rqsH || width > rqsW) {
final int heightRatio = Math.round((float) height / (float) rqsH);
final int widthRatio = Math.round((float) width / (float) rqsW);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
options.inSampleSize = inSampleSize;
}
return BitmapFactory.decodeFile(path, options);// 主要通過option里的inSampleSize對原圖片進行按比例壓縮
}
上面就是簡單的質量壓縮與尺寸壓縮。
Ⅹ android裡面的圖片資源怎麼都是png的
因為png格式的文件支持透明度,android中可以存在四種png後綴的image文件
1.標准PNG: (ex.應用默認的icon.png)
符合PNG-8標準的PNG圖片, 只能做圖片, 不能放縮.
2.Android打包處理後的9.png: (ex.應用APK中打包的9.PNG)
為了保證佔用空間小,android在資源中刪除了標准PNG的大量冗餘信息,去除了周邊的空白像素,減少了IDAT數據段,
在打包成APK的時候,裡面的文件就是不可放縮的9.png, 雖然後綴名還是9.png,但是已經沒有放縮功能,並且把邊界多的兩個像素也去除了.
3.Android不可放縮的9.png:
在drawable中可以找到9.png圖片,但是使用Draw 9-patch軟體打開會報錯,但是可以在drawable中使用,
這些文件只是刪除了冗餘信息,並且加上了邊界的兩個像素點,
並沒有添加可放縮的flag到文件中,這些文件只能作為打包後的9.PNG使用(但是size會小一些),不能放縮和做背景.
4.Android可放縮的9.png:
可以使用Draw 9-patch軟體打開,不會報錯,在drawable中使用,android會根據設置的黑色像素點來進行放縮.
有添加可縮放的flag到文件中,可以做為View的背景或者普通的圖片顯示.在做背景時,可以進行拉伸和放縮.
在做非背景時,比如像ImageView這類設置src圖片則不隨view變化,按其自身大小顯示部分或全部.
另: 對9.png後綴文件的解析邏輯及可放縮chunk檢查的邏輯 Images.cpp
對9.PNG判斷函數入口: Drawable.java中對」nine-patch」欄位的判斷