androidbitmap顏色
㈠ Android開發時獲取到int[]數組轉化成Bitmap圖像有失真,顏色不正常,怎麼辦如下圖中間區域
你把轉換前後的值都用System.out()輸出來,查看一下數值有沒有變化
㈡ android怎麼用攝像頭掃描感知掃描區域的大概顏色
第一步,將圖片縮小,再整個過程中,可以降低計算量和減少內存的使用,跟不縮小也能達到一樣的效果
/**
* Scale the bitmap down so that it's smallest dimension is
* {@value #CALCULATE_BITMAP_MIN_DIMENSION}px. If {@code bitmap} is smaller than this, than it
* is returned.
*/
private static Bitmap scaleBitmapDown(Bitmap bitmap) {
final int minDimension = Math.min(bitmap.getWidth(), bitmap.getHeight());
if (minDimension <= CALCULATE_BITMAP_MIN_DIMENSION) {
// If the bitmap is small enough already, just return it
return bitmap;
}
final float scaleRatio = CALCULATE_BITMAP_MIN_DIMENSION / (float) minDimension;
return Bitmap.createScaledBitmap(bitmap,
Math.round(bitmap.getWidth() * scaleRatio),
Math.round(bitmap.getHeight() * scaleRatio),
false);
}
第二步,將縮小後的圖片數據,放在一個int 數組里
/**
* Factory-method to generate a {@link ColorCutQuantizer} from a {@link Bitmap} object.
*
* @param bitmap Bitmap to extract the pixel data from
* @param maxColors The maximum number of colors that should be in the result palette.
*/
static ColorCutQuantizer fromBitmap(Bitmap bitmap, int maxColors) {
final int width = bitmap.getWidth();
final int height = bitmap.getHeight();
final int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
return new ColorCutQuantizer(new ColorHistogram(pixels), maxColors);
}
第三步,將這個int 數組由小到大排序,就相當於,將一張圖片一樣的顏色堆在一起,然後計算共有多少種顏色,每種顏色它是多大,這些是在一個叫ColorHistogram(顏色直方圖)類裡面計算的,用顏色直方圖來說,就是共有多少柱顏色,每柱顏色有多高
/**
* Class which provides a histogram for RGB values.
*/
final class ColorHistogram {
private final int[] mColors;
private final int[] mColorCounts;
private final int mNumberColors;
/**
* A new {@link ColorHistogram} instance.
*
* @param pixels array of image contents
*/
ColorHistogram(final int[] pixels) {
// Sort the pixels to enable counting below
Arrays.sort(pixels);
// Count number of distinct colors
mNumberColors = countDistinctColors(pixels);
// Create arrays
mColors = new int[mNumberColors];
mColorCounts = new int[mNumberColors];
// Finally count the frequency of each color
countFrequencies(pixels);
}
/**
* @return 獲取共用多少柱不同顏色 number of distinct colors in the image.
*/
int getNumberOfColors() {
return mNumberColors;
}
/**
* @return 獲取排好序後的不同顏色的數組 an array containing all of the distinct colors in the image.
*/
int[] getColors() {
return mColors;
}
/**
* @return 獲取保存每一柱有多高的數組 an array containing the frequency of a distinct colors within the image.
*/
int[] getColorCounts() {
return mColorCounts;
}
//計算共用多少柱不同顏色
private static int countDistinctColors(final int[] pixels) {
if (pixels.length < 2) {
// If we have less than 2 pixels we can stop here
return pixels.length;
}
// If we have at least 2 pixels, we have a minimum of 1 color...
int colorCount = 1;
int currentColor = pixels[0];
// Now iterate from the second pixel to the end, counting distinct colors
for (int i = 1; i < pixels.length; i++) {
// If we encounter a new color, increase the population
if (pixels[i] != currentColor) {
currentColor = pixels[i];
colorCount++;
}
}
return colorCount;
}
//計算每一柱有多高
private void countFrequencies(final int[] pixels) {
if (pixels.length == 0) {
return;
}
int currentColorIndex = 0;
int currentColor = pixels[0];
mColors[currentColorIndex] = currentColor;
mColorCounts[currentColorIndex] = 1;
Log.i(pixels.length,+ pixels.length);
if (pixels.length == 1) {
// If we only have one pixel, we can stop here
return;
}
// Now iterate from the second pixel to the end, population distinct colors
for (int i = 1; i < pixels.length; i++) {
if (pixels[i] == currentColor) {
// We've hit the same color as before, increase population
mColorCounts[currentColorIndex]++;
} else {
// We've hit a new color, increase index
currentColor = pixels[i];
currentColorIndex++;
mColors[currentColorIndex] = currentColor;
mColorCounts[currentColorIndex] = 1;
}
}
}
}
第四步,將各種顏色,根據RGB轉HSL演算法,得出對應的HSL(H: Hue 色相,S:Saturation 飽和度L Lightness 明度),根據特定的條件,比如是明度L是否接近白色,黑色,還有一個判斷叫isNearRedILine,解釋是@return true if the color lies close to the red side of the I line(接近紅色私密區域附近?).,然後根據這三個條件,過濾掉這些顏色,什麼是HSL和RGB轉HSL演算法可以查看下網路,比較有詳細說明
/**
* Private constructor.
*
* @param colorHistogram histogram representing an image's pixel data
* @param maxColors The maximum number of colors that should be in the result palette.
*/
private ColorCutQuantizer(ColorHistogram colorHistogram, int maxColors) {
final int rawColorCount = colorHistogram.getNumberOfColors();
final int[] rawColors = colorHistogram.getColors();//顏色數組
final int[] rawColorCounts = colorHistogram.getColorCounts();//對應rawColors每一個顏色數組的大小
// First, lets pack the populations into a SparseIntArray so that they can be easily
// retrieved without knowing a color's index
mColorPopulations = new SparseIntArray(rawColorCount);
for (int i = 0; i < rawColors.length; i++) {
mColorPopulations.append(rawColors[i], rawColorCounts[i]);
}
// Now go through all of the colors and keep those which we do not want to ignore
mColors = new int[rawColorCount];
int validColorCount = 0;
for (int color : rawColors) {
if (!shouldIgnoreColor(color)) {
mColors[validColorCount++] = color;
}
}
Log.d(mColors length, +mColors.length);
if (validColorCount <= maxColors) {
// The image has fewer colors than the maximum requested, so just return the colors
mQuantizedColors = new ArrayList();
for (final int color : mColors) {
mQuantizedColors.add(new Swatch(color, mColorPopulations.get(color)));
}
} else {
// We need use quantization to rece the number of colors
mQuantizedColors = quantizePixels(validColorCount - 1, maxColors);
}
}
㈢ android Drawable、Bitmap、Canvas和Paint各相當於實際畫畫時候的什麼工具,請詳細告知!
bitmap:點陣圖,一般後綴為bmp,是一種像素顯示對象。
drawable:一種圖形對象,用來裝載圖形並可做一些高級圖像處理。
canvas:畫布,一種處理過程,可用來管理bitmap,提供基礎圖像操作。
paint:畫筆,畫圖工具,管理顏色,樣式,字體。
㈣ android createBitmap,如何設置背景色
此方法是根據int[] colors色素組創建Bitmap,你可以到這里看一下:http://blog.csdn.net/gaomatrix/article/details/6532468
㈤ Android Bitmap 與 Drawable之間的區別和轉換
Android bitmap和drawable的區別和轉換如下:
1.bitmap 轉換 drawable
java">Bitmapbitmap=newBitmap(...);Drawabledrawable=newBitmapDrawable(bitmap);
//Drawabledrawable=newFastBitmapDrawable(bitmap);
2.Drawable to Bitmap
BitmapDrawable, FastBitmapDrawable直接用getBitmap
b. 其他類型的Drawable用Canvas畫到一個bitmap上
Canvascanvas=newCanvas(bitmap)
drawable.draw(canvas);
Drawabled=ImagesList.get(0);Bitmapbitmap=((BitmapDrawable)d).getBitmap();
區別如下:
1.Bitmap - 稱作點陣圖,一般點陣圖的文件格式後綴為bmp,當然編碼器也有很多如RGB565、RGB888。作為一種逐像素的顯示對象執行效率高,但是缺點也很明顯存儲效率低。
2.Drawable - 作為Android平下通用的圖形對象,它可以裝載常用格式的圖像,比如GIF、PNG、JPG,當然也支持BMP,當然還提供一些高級的可視化對象,比如漸變、圖形等。
另外還有如下相類似的格式:
Canvas - 名為畫布,可以看作是一種處理過程,使用各種方法來管理Bitmap、GL或者Path路徑,同時它可以配合Matrix矩陣類給圖像做旋轉、縮放等操作,同時Canvas類還提供了裁剪、選取等操作。
Paint - 可以把它看做一個畫圖工具,比如畫筆、畫刷。管理了每個畫圖工具的字體、顏色、樣式。
㈥ android 生成 bitmap 我現在知道 字體 ,顏色 ,字大小 ,字的樣式,怎麼用這些已知條件生成 BITMAP啊
這回答叫什麼???答非所問
㈦ android如何對bitmap處理,使其馬賽克!
簡單辦法,先設置馬賽克粒度
1不打馬賽克
2將相鄰兩行兩列的4個像素
3相鄰三行三列的9個元素
以此類推
以粒度2為例
將相鄰兩行兩列的4個像素的顏色分量取平均值 然後用這個平均值來填寫這4個像素
這種就可以作為一個簡單的馬賽克了。
當然你要復雜一點可以用上一個函數來代替平均值
比如 int fun(int col,int row, int red,int green,int blue)
只要這個函數的曲線夠詭異,你馬賽克效果越混亂。
㈧ Android bitmap alpha 什麼是圖片的alpha值,alpha值有什麼作用
這個指的就是透明度,android裡面xml是八位16進制數表示,譬如#ff123a11 前兩位是透明度,後六位是顏色數值,也可以直接使用後6位,這樣前兩位的數值就默認為ff即為白色,前兩位就是alpha值
㈨ android bitmap怎麼創建canvas
點陣圖是我們開發中最常用的資源,畢竟一個漂亮的界面對用戶是最有吸引力的。
1. 從資源中獲取點陣圖
可以使用BitmapDrawable或者BitmapFactory來獲取資源中的點陣圖。
當然,首先需要獲取資源:
Resources res=getResources();
復制代碼
使用BitmapDrawable獲取點陣圖
1. 使用BitmapDrawable (InputStream is)構造一個BitmapDrawable;
2. 使用BitmapDrawable類的getBitmap()獲取得到點陣圖;
// 讀取InputStream並得到點陣圖
InputStream is=res.openRawResource(R.drawable.pic180);
BitmapDrawable bmpDraw=new BitmapDrawable(is);
Bitmap bmp=bmpDraw.getBitmap();
復制代碼
或者採用下面的方式:
BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);
Bitmap bmp=bmpDraw.getBitmap();
復制代碼
使用BitmapFactory獲取點陣圖
(Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)
使用BitmapFactory類decodeStream(InputStream is)解碼點陣圖資源,獲取點陣圖。
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
復制代碼
BitmapFactory的所有函數都是static,這個輔助類可以通過資源ID、路徑、文件、數據流等方式來獲取點陣圖。
以上方法在編程的時候可以自由選擇,在Android SDK中說明可以支持的圖片格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。
2. 獲取點陣圖的信息
要獲取點陣圖信息,比如點陣圖大小、像素、density、透明度、顏色格式等,獲取得到Bitmap就迎刃而解了,這些信息在Bitmap的手冊中,這里只是輔助說明以下2點:
* 在Bitmap中對RGB顏色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發中可能需要注意這個小問題;
* Bitmap還提供了compress()介面來壓縮圖片,不過AndroidSAK只支持PNG、JPG格式的壓縮;其他格式的需要Android開發人員自己補充了。
3. 顯示點陣圖
顯示點陣圖可以使用核心類Canvas,通過Canvas類的drawBirmap()顯示點陣圖,或者藉助於BitmapDrawable來將Bitmap繪制到Canvas。當然,也可以通過BitmapDrawable將點陣圖顯示到View中。
轉換為BitmapDrawable對象顯示點陣圖
// 獲取點陣圖
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
// 轉換為BitmapDrawable對象
BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
// 顯示點陣圖
ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);
iv2.setImageDrawable(bmpDraw);
復制代碼
使用Canvas類顯示點陣圖
這兒採用一個繼承自View的子類Panel,在子類的OnDraw中顯示
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new Panel(this));
}class Panel extends View{
public Panel(Context context) {
super(context);
}
public void onDraw(Canvas canvas){
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10, null);
}
}
}
復制代碼
4. 點陣圖縮放
(1)將一個點陣圖按照需求重畫一遍,畫後的點陣圖就是我們需要的了,與點陣圖的顯示幾乎一樣:drawBitmap(Bitmapbitmap, Rect src, Rect dst, Paint paint)。
(2)在原有點陣圖的基礎上,縮放原點陣圖,創建一個新的點陣圖:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
(3)藉助Canvas的scale(float sx, float sy) (Preconcat the current matrix with the specified scale.),不過要注意此時整個畫布都縮放了。
(4)藉助Matrix:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
Matrix matrix=new Matrix();
matrix.postScale(0.2f, 0.2f);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
bmp.getHeight(),matrix,true);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(dstbmp, 10, 10, null);
5. 點陣圖旋轉
同樣,點陣圖的旋轉也可以藉助Matrix或者Canvas來實現。
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
Matrix matrix=new Matrix();
matrix.postScale(0.8f, 0.8f);
matrix.postRotate(45);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
bmp.getHeight(),matrix,true);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(dstbmp, 10, 10, null);
旋轉效果:
6.圖片水印的生成方法
生成水印的過程。其實分為三個環節:第一,載入原始圖片;第二,載入水印圖片;第三,保存新的圖片。
/**
* create the bitmap from a byte array
*
* @param src the bitmap object you want proecss
* @param watermark the water mark above the src
* @return return a bitmap object ,if paramter's length is 0,return null
*/
private Bitmap createBitmap( Bitmap src, Bitmap watermark )
{
String tag = "createBitmap";
Log.d( tag, "create a new bitmap" );
if( src == null )
{
return null;
}
int w = src.getWidth();
int h = src.getHeight();
int ww = watermark.getWidth();
int wh = watermark.getHeight();
//create the new blank bitmap
Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//創建一個新的和SRC長度寬度一樣的點陣圖
Canvas cv = new Canvas( newb );
//draw src into
cv.drawBitmap( src, 0, 0, null );//在 0,0坐標開始畫入src
//draw watermark into
cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角畫入水印
//save all clip
cv.save( Canvas.ALL_SAVE_FLAG );//保存
//store
cv.restore();//存儲
return newb;
}
7.Canvas的save和restore
onDraw方法會傳入一個Canvas對象,它是你用來繪制控制項視覺界面的畫布。
在onDraw方法里,我們經常會看到調用save和restore方法,它們到底是干什麼用的呢?
❑ save:用來保存Canvas的狀態。save之後,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作。
❑ restore:用來恢復Canvas之前保存的狀態。防止save後對Canvas執行的操作對後續的繪制有影響。
save和restore要配對使用(restore可以比save少,但不能多),如果restore調用次數比save多,會引發Error。save和restore之間,往往夾雜的是對Canvas的特殊操作。
例如:我們先想在畫布上繪制一個右向的三角箭頭,當然,我們可以直接繪制,另外,我們也可以先把畫布旋轉90°,畫一個向上的箭頭,然後再旋轉回來(這種旋轉操作對於畫圓周上的標記非常有用)。然後,我們想在右下角有個20像素的圓,那麼,onDraw中的核心代碼是:
int px = getMeasuredWidth();
int py = getMeasuredWidth();
// Draw background
canvas.drawRect(0, 0, px, py, backgroundPaint);
canvas.save();
canvas.rotate(90, px/2, py/2);
// Draw up arrow
canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
canvas.restore();
// Draw circle
canvas.drawCircle(px - 10, py - 10, 10, linePaint);
效果如圖1所示:
如果我們不調用save和restore會是什麼樣子呢?如圖2所示:
從這兩個圖中,我們就能看到圓圈位置的明顯差異。不進行Canvas的save和restore操作的話,所有的圖像都是在畫布旋轉90°後的畫布上繪制的。當執行完onDraw方法,系統自動將畫布恢復回來。save和restore操作執行的時機不同,就能造成繪制的圖形不同。
㈩ android: ImageView的setImageBitmap()方法
一、ImageView的setImageBitmap()是設置imageView組件的圖片顯示。它的定義和源碼如下:
1、在源代碼中輸入:if this is used frequently,may handle bitmaps explicitly // to rece the intermedite drawable abject;
2、它實際上是對setImageDrawable介面的封裝,支持直接略過Bitmap對象進行組件圖片的設置。需要指出的是這個方法設置圖片時,進行大圖片的處理時,注意對圖片的縮放,否則會內存溢出。
(10)androidbitmap顏色擴展閱讀:
一、Bitmap設置代碼:
1、ImageView的setImageBitmap()是設置imageView組件的圖片顯示,實際上是setImageDrawable介面的封裝,支持直接略過Bitmap對象進行組件圖片的設置。
2、需要指出的是這個方法設置圖片時,進行大圖片的處理時,注意對圖片的縮放,否則會內存溢出。if this is used frequently,may handle bitmaps explicitly // to rece the intermedite drawable abject;
二、根據位深度,可將點陣圖分為1、4、8、16、24及32點陣圖像等。每個像素使用的信息位數越多,可用的顏色就越多,顏色表現就越逼真,相應的數據量越大。例如,位深度為 1 的像素點陣圖只有兩個可能的值(黑色和白色)。
1、所以又稱為二值點陣圖。位深度為 8 的圖像有 2^8(即 256)個可能的值。位深度為 8 的灰度模式圖像有 256 個可能的灰色值。
2、RGB圖像由三個顏色通道組成。8 位/通道的 RGB 圖像中的每個通道有 256 個可能的值,這意味著該圖像有 1600 萬個以上可能的顏色值。
3、有時將帶有 8 位/通道 (bpc) 的 RGB 圖像稱作 24 點陣圖像(8 位 x 3 通道 = 24 位數據/像素)。通常將使用24位RGB組合數據位表示的的點陣圖稱為真彩色點陣圖。
4、BMP文件是微軟公司所開發的一種交換和存儲數據的方法,各個版本的Windows都支持BMP格式的文件。Windows提供了快速、方便的存儲和壓縮BMP文件的方法。BMP格式的缺點是,要佔用較大的存儲空間,文件尺寸太大。