2014年4月26日 星期六

android opencv

Size dsize = new Size(img.width() * scale, img.height() * scale);
Mat img2 = new Mat();
Imgproc.resize(img, img2, dsize);
scale为缩放的大小
resize函数参数1为原图,参数2为缩放之后的图

2、图片读写
Mat img = Highgui.imread(bitmappath);
Highgui.imwrite("/mnt/sdcard/www.png", thumb2);

3、bitmap转为Mat
Mat bgImg = Utils.bitmapToMat(bm); Imgproc.cvtColor(bgImg, bgImg, Imgproc.COLOR_RGB2BGR, 3);
第二行代码是颜色值转换,因为从实验来看,bitmap转为mat之后,红蓝值可能会发生颠倒,因而用此方法再将颜色值转回来

4、Mat旋转
Mat mat_bmp = img2; double radians = Math.toRadians(90); double sin = Math.abs(Math.sin(radians)); double cos = Math.abs(Math.cos(radians)); int width = mat_bmp.width(); int height = mat_bmp.height(); int newWidth = (int) (width * cos + height * sin); int newHeight = (int) (width * sin + height * cos); // 能把原图像和旋转后图像同时放入的外框 int frameWidth = Math.max(width, newWidth); int frameHeight = Math.max(height, newHeight); Size frameSize = new Size(frameWidth, frameHeight); Mat mat_frame = new Mat(frameSize, mat_bmp.type()); // 将原图像copy进外框 int offsetX = (frameWidth - width) / 2; int offsetY = (frameHeight - height) / 2; Mat mat_frame_submat = mat_frame.submat(offsetY, offsetY + height, offsetX, offsetX + width); mat_bmp.copyTo(mat_frame_submat); // 旋转外框 Point center = new Point(frameWidth / 2, frameHeight / 2); Mat mat_rot = Imgproc.getRotationMatrix2D(center, 90, 1.0); Mat mat_res = new Mat(); // result Imgproc.warpAffine(mat_frame, mat_res, mat_rot, frameSize, Imgproc.INTER_LINEAR, Imgproc.BORDER_CONSTANT, Scalar.all(0)); // 从旋转后的外框获取新图像 offsetX = (frameWidth - newWidth) / 2; offsetY = (frameHeight - newHeight) / 2; Mat mat_res_submat = mat_res.submat(offsetY, offsetY + newHeight, offsetX, offsetX + newWidth);
5、Mat截取
Mat imageVROI = mat_res_submat.submat(roi);
roi为Rect,例如:Rect roi = new Rect(0, 0, width, height);

6、图片合成(添加水印)
假如frontImg为要添加的图,bgImg为背景图
Mat imageROI = bgImg.submat(new Rect(a, b, c, d));
frontImg.copyTo(ImageROI,frontImg);
Rect第一、二个参数分别为前面的要添加到背景图的横纵坐标,三、四参数为宽高。

7、遍历像素
byte sdata[] = { 0, 0, 0 };
byte ndata[] = { 0, 0, 0 };
for (int i = 0; i < img.rows(); i++)
{
for (int j = 0; j < img.cols(); j++)
{
if (img.channels() == 3)
{
img.get(i, j, sdata);
if ((sdata[0] == (byte) 255) && (sdata[1] == (byte) 20) && (sdata[2] == (byte) 255))
img.put(i, j, ndata);
}
}
}
上面代码实现的操作为遍历所有像素,并将颜色值为255,20,255的像素点替换为颜色值为0,0,0

xcode 常用熱鍵

摺疊所有函式
    CMD + SHIFT + ALT + 左箭頭
摺疊當前函式
    CMD +  ALT + 左箭頭

MySQL Transaction

MySQL 常用的兩個資料表類型:MyISAM、InnoDB,MyISAM 不支援交易功能

交易功能4個特性 (ACID)

  •  Atomicity (原子性、不可分割):交易內的 SQL 指令,不管在任何情況,都只能是全部執行完成,或全部不執行。若是發生無法全部執行完成的狀況,則會回滾(rollback)到完全沒執行時的狀態。
  • Consistency (一致性):交易完成後,必須維持資料的完整性。所有資料必須符合預設的驗證規則、外鍵限制...等。
  • Isolation (隔離性):多個交易可以獨立、同時執行,不會互相干擾。這一點跟後面會提到的「隔離層級」有關。
  • Durability (持久性):交易完成後,異動結果須完整的保留。

開始進入交易模式

  • SQL 指令:START TRANSACTION 或 BEGIN

結束交易模式

  • 交易完成:使用 COMMIT 儲存所有變動,並結束交易。
  • 交易過程異常:使用 ROLLBACK 回滾,取消交易,還原到未進行交易的狀態。(若交易過程連線中斷,沒 COMMIT 提交的變更,亦會如同執行 ROLLBACK 取消交易)

儲存點 (SAVEPOINT)

  • 交易過程中,可標示多個不同的儲存點,有需要時可 ROLLBACK 到某個儲存點。
  • 建立儲存點:SAVEPOINT 名稱
  • 刪除儲存點:RELEASE SAVEPOINT 名稱
  • ROLLBACK 到某個儲存點:ROLLBACK TO SAVEPOINT 名稱
  • 如果建立新儲存點時,已有同名稱的舊儲存點,舊儲存點將被刪除,並建立新的儲存點。
  • 官網說明:http://dev.mysql.com/doc/refman/5.7/en/savepoint.html

不能 ROLLBACK 的指令

會造成自動終止交易並 COMMIT 的指令

  • 執行這些指令時,如同先執行了 commit,也就是會先有 commit 的效果。
  • DDL 指令:ALERT TABLE、CREATE INDEX、CREATE TABLE、DROP TABLE、DROP DATABASE、RENAME TABLE、TRUNCATE、LOCK TABLES、UNLOCK TABLES...等
  • SET AUTOCOMMIT=1、 BEGIN、START TRANSACTION
  • 其他,可參考官網更詳細的說明:http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

 AUTOCOMMIT 自動提交設定

  • AUTOCOMMIT 的設定值,預設一般都是 1
  • 查詢目前 AUTOCOMMIT 的設定值:SELECT @@AUTOCOMMIT
  • 將 AUTOCOMMIT 改為 0 時 ( SET AUTOCOMMIT=0 ),就算沒使用 START TRANSACTION 或 BEGIN ,整個連線執行的 SQL 指令,都會等到下達 COMMIT 提交後,才會真正儲存變更。也就是當 AUTOCOMMIT=0 時,跟在交易模式下相同。

2014年4月13日 星期日

android ScrollView ListView 取消陰影


scrollView.setHorizontalFadingEdgeEnabled(false);
scrollView.setVerticalFadingEdgeEnabled(false);

android 2.3 以上
scroll_view.setOverScrollMode(ScrollView.OVER_SCROLL_NEVER);


不隱藏scrollbar
scroll_view.setScrollbarFadingEnabled(false);

設定scrollbar in code
try {
Field mScrollCacheField = View.class
.getDeclaredField("mScrollCache");
mScrollCacheField.setAccessible(true);
Object mScrollCache = mScrollCacheField.get(scroll_view);
Field scrollBarField = mScrollCache.getClass().getDeclaredField(
"scrollBar");
scrollBarField.setAccessible(true);
Object scrollBar = scrollBarField.get(mScrollCache);
Method method = scrollBar.getClass().getDeclaredMethod(
"setVerticalThumbDrawable", Drawable.class);
method.setAccessible(true);
method.invoke(scrollBar,
getResources().getDrawable(R.drawable.scrollbar_track));
method = scrollBar.getClass().getDeclaredMethod(
"setVerticalTrackDrawable", Drawable.class);
method.setAccessible(true);
method.invoke(scrollBar,
getResources().getDrawable(R.drawable.scrollbar_thumb));
} catch (Exception e) {
e.printStackTrace();
}




2014年4月8日 星期二

android TextView 注意

// does not work
tv.setPadding(20, 20, 20, 20);
tv.setBackgroundResource(R.drawable.border);


// works
tv.setBackgroundResource(R.drawable.border);
tv.setPadding(20, 20, 20, 20);

2014年4月7日 星期一

android RadioButton set button in code

setButtonDrawable(getRadioIcon());


private StateListDrawable getRadioIcon() {
StateListDrawable states = new StateListDrawable();
states.addState(new int[] { android.R.attr.state_checked },
getCheckedIcon());
states.addState(new int[] { -android.R.attr.state_checked },
getNormalIcon());
states.addState(new int[] {}, getNormalIcon());
return states;
}

private GradientDrawable getNormal() {
int size = GSet.getMargin(40);
int strokeWidth = GSet.getMargin(3); // 3dp
int strokeColor = Color.parseColor("#0199fc");
int fillColor = Color.parseColor("#00000000");
GradientDrawable gd = new GradientDrawable();
gd.setSize(size, size);
gd.setShape(GradientDrawable.OVAL);
gd.setColor(fillColor);
gd.setStroke(strokeWidth, strokeColor);
return gd;
}

private GradientDrawable getChecked() {
int fillColor = Color.BLACK;
GradientDrawable gd = new GradientDrawable();
gd.setShape(GradientDrawable.OVAL);
gd.setColor(fillColor);
return gd;
}

private LayerDrawable getNormalIcon() {
Drawable[] layers = new Drawable[1];
layers[0] = getNormal();
LayerDrawable drawable = new LayerDrawable(layers);
int margin = GSet.getMargin(5);
drawable.setLayerInset(0, margin, margin, margin, margin);
return drawable;
}

private LayerDrawable getCheckedIcon() {
Drawable[] layers = new Drawable[2];
layers[0] = getNormal();
layers[1] = getChecked();
LayerDrawable drawable = new LayerDrawable(layers);
int margin = GSet.getMargin(5);
drawable.setLayerInset(0, margin, margin, margin, margin);
margin = GSet.getMargin(15);
drawable.setLayerInset(1, margin, margin, margin, margin);
return drawable;
}