public void ReadImageFromFile()//加载照片 { var bl = SilverlightLFC.common.Environment.getEnvironment().OpenImage(); if (bl == null || bl.Result == null || bl.Result.Count == 0) { return; } var v = bl.Result.FirstOrDefault(); if (v == null) { return; } //PhotoLayers.Children.Clear(); if (SelectLayer == null) { PhotoLayer pl = new PhotoLayer(); PhotoLayers.Children.Add(pl); SelectLayer = pl; //return; } SelectLayer.setPhoto(WriteableBitmapHelper.Clone(v), ScalePercent); setClip(); //SelectLayer.setScale(ScalePercent); }
public WriteableBitmap getAreaLResove(WriteableBitmap b) { int LsratrX, LstartY, LW, LH; LsratrX = Convert.ToInt32(20.9 / 70.9 * (b.PixelHeight / 9 * 16)); LsratrX = getCenterX(LsratrX, b.PixelWidth, b.PixelHeight); LstartY = Convert.ToInt32(18.8 / 39.9 * b.PixelHeight); LW = Convert.ToInt32(12.7 / 70.9 * (b.PixelHeight / 9 * 16)); LH = Convert.ToInt32(2.2 / 39.9 * b.PixelHeight); if (IsAnalyse) { DrawSelectArea(LsratrX, LstartY, LW, LH); } WriteableBitmap lb = getImageArea(b, LsratrX, LstartY, LW, LH); if (mp.SelectedArea.ContainsKey("RayleiResolutionLArea")) { mp.SelectedArea["RayleiResolutionLArea"] = WriteableBitmapHelper.Clone(lb); } else { mp.SelectedArea.Add("RayleiResolutionLArea", WriteableBitmapHelper.Clone(lb)); } return(lb); }
public WriteableBitmap getClip() { if ((SelectedImage == null) || (SelectedImage.Source == null) || !(SelectedImage.Source is BitmapSource)) { SilverlightLFC.common.Environment.ShowMessage("粘帖图片为空"); return(null); } return(WriteableBitmapHelper.Clone(SelectedImage.Source as WriteableBitmap)); }
void ChartPhoto_PhotoChanged(WriteableBitmap current) { if (IsNeedSave) //自己处理的结果不需要保存 { TempPhoto = WriteableBitmapHelper.Clone(ChartPhoto.getPhoto()); //备份原始图像 } //throw new NotImplementedException(); IsNeedSave = true;//默认都是要存的 }
//LParameter getTestParameter() //{ // LParameter lp = new LParameter(); // lp.Name = "亮度一致性"; // lp.Memo = "通过拍摄均匀光照下的灰度卡测试成像的亮度一致性"; // lp.Dimension = "%"; // lp.TestWay = "中调灰卡"; // lp.TestTime = EndTime; // lp.SpendTime = (EndTime - BeginTime).TotalMilliseconds; // lp.Value = Convert.ToDouble(TextValue.Text); // return lp; //} //public void WriteToHTML() //{ // LParameter lp = getTestParameter(); // string s = ""; // s = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN/\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\">"; // s = s + "<head><meta http-equiv=\"Content-Language\" content=\"zh-cn\" /><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"; // s = s + "<title>shiyan</title><style type=\"text/css\">.style1 {text-align: left;}.style2 {margin-left: 40px;}.style3 { text-decoration: underline; margin-left: 40px;}</style></head>"; // s = s + "<body>"; // s = s + "<h2>测试结果信息:</h2>"; // //foreach (IParameter p in ResultList) // //{ // s = s + "指标名称:" + lp.Name; // s = s + "<p class=\"style2\">说明:" + lp.Memo + "</p>"; // s = s + "<p>测试时间:" + lp.TestTime.ToString() + "</p>"; // if (lp.Value != Double.NaN) // { // s = s + "<p>测试值:" + lp.Value.ToString() + lp.Dimension + "</p>"; // } // //} // s = s + "</body></html>"; // SilverlightLFC.common.Environment.getEnvironment().SaveFileString(s, "HTML文件|*.html"); // //SaveFileDialog of = new SaveFileDialog(); // //of.Filter = "HTML文件|*.html"; // //of.ShowDialog(); // //byte[] sb = System.Text.Encoding.Unicode.GetBytes(s); // //Stream fs = of.OpenFile(); // //if (fs != null) // //{ // // fs.Write(sb, 0, sb.Length); // //} // //fs.Close(); //} private void buttonResumePhoto_Click(object sender, RoutedEventArgs e) { if (TempPhoto != null) { ChartPhoto.setPhoto(WriteableBitmapHelper.Clone(TempPhoto)); //testHelper.CurrentChart = new WriteableBitmap(TempPhoto); //TempPhoto = null; } }
public List <WriteableBitmap> getClipList() { List <WriteableBitmap> bl = new List <WriteableBitmap>(); foreach (Image im in ClipList.Children) { bl.Add(WriteableBitmapHelper.Clone(im.Source as WriteableBitmap)); } return(bl); }
//private void buttonTest_Click(object sender, RoutedEventArgs e) //{ // autoTest(); //} private void buttonOpen_Click(object sender, RoutedEventArgs e) { var b = SilverlightLFC.common.Environment.getEnvironment().OpenImage(); if (b == null || b.Result.Count == 0) { return; } ChartPhoto.setPhoto(WriteableBitmapHelper.Clone(b.Result.FirstOrDefault())); }
public WriteableBitmap CorrectXMark(WriteableBitmap b) //矫正,并且返回矫正以后的图像 { //首先使用中心圆进行位置矫正 //再检查上面的两个角圆的圆心,利用其来矫正角度 //然后检查左右的对称性 //然后利用中心园检查上下的对称 //检查中心园的直径,建立像素和大小的关系 Point CP = getCenterPoint(b, 100);//找到真正的图片中心点 if (CP.X == Double.NaN || CP.Y == Double.NaN) { return(null); } if (CP.X == 0 && CP.Y == 0) { return(b); } int dx = Convert.ToInt32(CP.X - b.PixelWidth / 2); int dy = Convert.ToInt32(CP.Y - b.PixelHeight / 2); WriteableBitmap cb = MoveTrans(b, -dx, -dy);//对准操作 mp.CorrectMovePhoto = WriteableBitmapHelper.Clone(cb); Point LTP, RTP, LBP; LTP = getLTPoint(cb); RTP = getRTPoint(cb); LTP = getTrueCircleCenter(cb, LTP); RTP = getTrueCircleCenter(cb, RTP); float arc = getArc(LTP, RTP); //得到倾斜的角度 WriteableBitmap rb = RotateTrans(cb, -arc); //矫正角度 //cb.Dispose(); CorrectPhoto = SilverlightLFC.common.WriteableBitmapHelper.Clone(rb);//给出纠正角度的 mp.CorrectRotatePhoto = SilverlightLFC.common.WriteableBitmapHelper.Clone(CorrectPhoto); //不进行缩放,而是矫正定位,让其他的方法定位的区域依据四角的标定点进行。 //mp.CorrectScalePhoto = mp.CorrectRotatePhoto; LBP = getLBPoint(rb); LBP = getTrueCircleCenter(rb, LBP); int CropW = Convert.ToInt32(RTP.X - LTP.X); int CropH = Convert.ToInt32(LBP.Y - LTP.Y); WriteableBitmap CropB; CropB = getImageArea(rb, Convert.ToInt32(LTP.X), Convert.ToInt32(LTP.Y), CropW, CropH); //rb.Dispose(); CropPhoto = SilverlightLFC.common.WriteableBitmapHelper.Clone(CropB);//在本对象记录下裁剪过的图像 mp.SelectedPhoto = SilverlightLFC.common.WriteableBitmapHelper.Clone(CropB); mp.CroppedPhoto = WriteableBitmapHelper.Clone(CropB); return(CropB); }
public void setSelectArea(string key, WriteableBitmap b)//自动设置选区,并且改变不会影响原始信息 { if (mp.SelectedArea.ContainsKey(key)) { mp.SelectedArea[key] = WriteableBitmapHelper.Clone(b); } else { mp.SelectedArea.Add(key, WriteableBitmapHelper.Clone(b)); } }
public void DrawSelectArea(int StartX, int StartY, int w, int h)//在分析照片上面绘制出选择的区域,便于调试 { if (AnalysePhoto == null) { if (mp.SourcePhoto == null) { return; } mp.SelectedPhoto = WriteableBitmapHelper.Clone(mp.SourcePhoto); } DrawRecArea(AnalysePhoto, StartX, StartY, w, h, Colors.Red); //mp.SelectedPhoto = new WriteableBitmap(AnalysePhoto); }
public void Copy()//把图片复制到剪贴板 { //CameraTestDesktop d = CameraTestDesktop.getDesktop(); if (SelectLayer == null) { if (PhotoLayers.Children.Count == 0) { return; } SelectLayer = PhotoLayers.Children[0] as PhotoLayer; } PhotoEditManager.Copy(WriteableBitmapHelper.Clone(SelectLayer.getPhoto())); }
public override void CorrectChart()//使用默认的内部来进行纠正 { if (ChartPhoto == null) { ChartPhoto = mp.SourcePhoto; mp.SelectedPhoto = CorrectISO12233Chart(ChartPhoto); CorrectPhoto = WriteableBitmapHelper.Clone(AnalysePhoto); } else { mp.SelectedPhoto = CorrectISO12233Chart(ChartPhoto); CorrectPhoto = WriteableBitmapHelper.Clone(AnalysePhoto); } }
private void buttonPaste_Click(object sender, RoutedEventArgs e) { ClearActiveAll(); CameraTestDesktop d = CameraTestDesktop.getDesktop(); if (d.getClip() == null) { return; } ProcessImageCanvas.setPhoto(WriteableBitmapHelper.Clone(d.getClip())); if (PhotoOperate != null) { PhotoOperate("Paste", ProcessImageCanvas.getPhoto()); } }
public override void CorrectChart()//使用默认的内部来进行纠正 { if (mp.SourcePhoto == null) { return; //ChartPhoto = mp.SourcePhoto;//直接使用记录的位图 //mp.CorrectPhoto = CorrectISO12233Chart(SourcePhoto); //mp.SelectedPhoto = new WriteableBitmap(mp.CorrectPhoto); } else { mp.CorrectPhoto = CorrectISO12233Chart(ChartPhoto); mp.SelectedPhoto = WriteableBitmapHelper.Clone(mp.CorrectPhoto); } }
public WriteableBitmap getBrightChangesImage(int n)//绘制亮度变化曲线,共n级 { if (ChartPhoto == null) { throw new SilverlightLFC.common.LFCException("没有设置测试卡照片", null); } WriteableBitmap cb = getImageArea(ChartPhoto, Convert.ToInt32(ChartPhoto.PixelWidth * 0.475), Convert.ToInt32(ChartPhoto.PixelHeight * 0.475), Convert.ToInt32(ChartPhoto.PixelWidth * 0.05), Convert.ToInt32(ChartPhoto.PixelHeight * 0.05)); WriteableBitmap ltb = getImageArea(ChartPhoto, 0, 0, Convert.ToInt32(ChartPhoto.PixelWidth * 0.05), Convert.ToInt32(ChartPhoto.PixelHeight * 0.05)); WriteableBitmap rtb = getImageArea(ChartPhoto, Convert.ToInt32(ChartPhoto.PixelWidth * 0.95), 0, Convert.ToInt32(ChartPhoto.PixelWidth * 0.05), Convert.ToInt32(ChartPhoto.PixelHeight * 0.05)); WriteableBitmap lbb = getImageArea(ChartPhoto, 0, Convert.ToInt32(ChartPhoto.PixelHeight * 0.95), Convert.ToInt32(ChartPhoto.PixelWidth * 0.05), Convert.ToInt32(ChartPhoto.PixelHeight * 0.05)); WriteableBitmap rbb = getImageArea(ChartPhoto, Convert.ToInt32(ChartPhoto.PixelWidth * 0.95), Convert.ToInt32(ChartPhoto.PixelHeight * 0.95), Convert.ToInt32(ChartPhoto.PixelWidth * 0.05), Convert.ToInt32(ChartPhoto.PixelHeight * 0.05)); Color cc = getAverageColor(cb); Color ltc = getAverageColor(ltb); Color rtc = getAverageColor(rtb); Color lbc = getAverageColor(lbb); Color rbc = getAverageColor(rbb); double bc = .299 * cc.R + .587 * cc.G + .114 * cc.B; double blt = .299 * ltc.R + .587 * ltc.G + .114 * ltc.B; double brt = .299 * rtc.R + .587 * rtc.G + .114 * rtc.B; double blb = .299 * lbc.R + .587 * lbc.G + .114 * lbc.B; double brb = .299 * rbc.R + .587 * rbc.G + .114 * rbc.B; double bb = (blt + brt + blb + brb) / 4; //平均四角亮度 double th = bc - bb; //亮度差 double ph = th / n; //平均每级的亮度 WriteableBitmap vb = WriteableBitmapHelper.Clone(ChartPhoto); //复制一份 var components = vb.PixelBuffer.ToArray(); for (int i = 0; i < components.Length; i += 4) { Color c = new Color(); c.B = components[i]; c.G = components[i + 1]; c.R = components[i + 2]; c.A = components[i + 3]; double cbright = 0.299 * c.R + 0.587 * c.G + 0.114 * c.B; Byte tbright = DrawPixToGradeBright(cbright, bc, ph, n); components[i] = tbright; components[i + 1] = tbright; components[i + 2] = tbright; components[i + 3] = 255; } return(vb); }
public void Test(List <WriteableBitmap> bList) { if (bList == null || bList.Count == 0) { return; } var b = bList.FirstOrDefault(); sb = WriteableBitmapHelper.Clone(b); if (!IsLeft) { b = isoc.FlipYImage(b); } lChartPhoto1.Photo = (b); try { long l = isoc.getResoveLines(sb, 0.735f, IsLeft); if (IsLeft) { textBlockIsLeft.Text = "左"; } else { textBlockIsLeft.Text = "右"; } testResult.Text = l.ToString() + "LP"; BorderLeft = Convert.ToDouble(isoc.ptp.ProcessInfor["RayleiResolutionLeftBorder"]); BorderRight = Convert.ToDouble(isoc.ptp.ProcessInfor["RayleiResolutionRightBorder"]); double p = Convert.ToDouble(isoc.ptp.ProcessInfor["RayleiResolutionRightPosition"]); string st = isoc.ptp.ProcessInfor["ISOCardType"].ToString(); if (st == "100-600") { comboBox1.SelectedIndex = 2; } if (st == "500-2000") { comboBox1.SelectedIndex = 0; } if (st == "1000-4000") { comboBox1.SelectedIndex = 1; } leftBorder.Text = BorderLeft.ToString(); rightBorder.Text = BorderRight.ToString(); RayleP.Text = p.ToString(); ll.Y1 = 0; ll.Y2 = lChartPhoto1.Height; ll.X1 = BorderLeft / b.PixelWidth * lChartPhoto1.Width; ll.X2 = ll.X1; if (!lChartPhoto1.getDrawObjectCanvas().Children.Contains(ll)) { lChartPhoto1.getDrawObjectCanvas().Children.Add(ll); } rl.Y1 = 0; rl.Y2 = lChartPhoto1.Height; rl.X1 = BorderRight / b.PixelWidth * lChartPhoto1.Width; rl.X2 = rl.X1; if (!lChartPhoto1.getDrawObjectCanvas().Children.Contains(rl)) { lChartPhoto1.getDrawObjectCanvas().Children.Add(rl); } pl.Y1 = 0; pl.Y2 = lChartPhoto1.Height; pl.X1 = p / b.PixelWidth * lChartPhoto1.Width; pl.X2 = pl.X1; if (!lChartPhoto1.getDrawObjectCanvas().Children.Contains(pl)) { lChartPhoto1.getDrawObjectCanvas().Children.Add(pl); } canvasBright.Children.Clear(); DrawGraphic dg = new DrawGraphic(canvasBright); dg.DrawBrightLines(isoc.getImageGrayVLine(b, Convert.ToInt64(p))); } catch (Exception xe) //未知的异常 { if (xe is LFCException) //已经是系统约定的错误类型,直接往上抛 { SilverlightLFC.common.Environment.ShowMessage(xe.Message); } else { SilverlightLFC.common.Environment.ShowMessage("测试错误,请检查照片"); } } }
public WriteableBitmap CorrectISO12233Chart(WriteableBitmap b) //纠正ISO12233方位,包括位置和旋转以及大小比例 { //算法是先得到包含中心方下侧边界的图像,测定图像中点的中心方下边界位置。同时得到距离中心线左右各1.5cm的垂线和黑方块的交点,轻易计算出倾角 //对小图纠倾,然后上面1毫米处得出水平线。从中央,向两侧找到两边位置坐标,就可以知道水平偏离中心的情况 //左侧边界向内一毫米位置,从原始图上面取列,可以得出上下的位置坐标,算出偏离垂直中心的情况 //对原图,先纠正(角度),再纠偏(位置) //最后,依据中心方的大小,来矫正缩放的比例,其边长为高度的大约0.1(0.10020) WriteableBitmap r, parc, ppos; mp.SourcePhoto = WriteableBitmapHelper.Clone(b); var tt = mp.SourcePhoto.PixelBuffer.ToArray(); WriteableBitmap cb = CorrectArcRegion(b); //只切下面的1/4高度来检查倾斜性 cb = AutoBright(cb); //给出自动白平衡 mp.CorrectBrightPhoto = WriteableBitmapHelper.Clone(cb); float arc = 0; Point tcp = PhotoTest.NullPoint; Point tlp = PhotoTest.NullPoint; Point trp = PhotoTest.NullPoint; List <int> al = getImageGrayVLine(cb, cb.PixelWidth / 2); //中点的位置取垂直像素列 int cy = FindLastBlack(al, 100); //找到越变点位置,注意是从大向小找。 if (cy != -1) { tcp = new Point(cb.PixelWidth / 2, cy);//这是中央相交点 } double bs = 1.5 / 39.9; int bps = Convert.ToInt32(bs * b.PixelHeight); List <int> lal = getImageGrayVLine(cb, cb.PixelWidth / 2 - bps); //中点的左侧位置取垂直像素列 int ly = FindLastBlack(lal, 100); //找到越变点位置,注意是从大向小找。 if (ly != -1) { tlp = new Point(cb.PixelWidth / 2 - bps, ly); //这是左侧相交点 if (Math.Abs((tcp.Y - tlp.Y) / (tcp.X - tlp.X)) > 0.75) //检查,如果找到的倾斜角度超过37度,矫正失败 { tlp = new Point(); } } List <int> ral = getImageGrayVLine(cb, cb.PixelWidth / 2 + bps); //中点的右侧位置取垂直像素列 int ry = FindLastBlack(ral, 100); //找到越变点位置,注意是从大向小找。 if (ry != -1) { trp = new Point(cb.PixelWidth / 2 + bps, ry); //这是右侧相交点 if (Math.Abs((trp.Y - tcp.Y) / (trp.X - tcp.X)) > 0.75) //检查,如果找到的倾斜角度超过37度,矫正失败 { tlp = PhotoTest.NullPoint; } } if (!IsNullPoint(trp) && !IsNullPoint(tlp)) { arc = Convert.ToSingle((Math.Atan((trp.Y - tlp.Y) / (trp.X - tlp.X)))); } if (IsNullPoint(trp)) { arc = Convert.ToSingle((Math.Atan((tcp.Y - tlp.Y) / (tcp.X - tlp.X)))); } if (IsNullPoint(tlp)) { arc = Convert.ToSingle((Math.Atan((trp.Y - tcp.Y) / (trp.X - tcp.X)))); } //cb = RotateBitmap(cb, -arc); //mp.CorrectRotatePhoto = WriteableBitmapHelper.Clone(cb); double bhs = 0.1 / 39.9; bps = Convert.ToInt32(bhs * b.PixelHeight); al = getImageGrayHLine(cb, cy - bps); //得到水平像素行 ral = new List <int>(al); //克隆水平像素,主要是保留右侧部分 lal = new List <int>(al); //克隆水平像素,主要是保留左侧部分 ral.RemoveRange(0, al.Count / 2 - 1); lal.RemoveRange(al.Count / 2 + 1, al.Count / 2 - 1); if (al.Count % 2 == 1) { lal.RemoveAt(lal.Count - 1); } int lbp, rbp; lbp = FindLastWhite(lal, 100); rbp = FindFirstWhite(ral, 100); bool IsCorrectMoveScale = true; if (lbp == -1 && rbp == -1) { IsCorrectMoveScale = false; } int SQLength = rbp + al.Count / 2 - lbp; int dx, dy; dx = (lbp + rbp + al.Count / 2) / 2 - cb.PixelWidth / 2; double YISOscale = 20.5 / 39.9; int topy = Convert.ToInt32(YISOscale * b.PixelHeight); int SQRTop = cy - SQLength + topy; dy = ((cy + topy) * 2 - SQLength) / 2 - b.PixelHeight / 2; //cb.Dispose(); this.MovePosition = new Point(dx, dy); this.RotateArc = arc; if (IsCorrectMoveScale) { ppos = MoveTrans(b, -dx, -dy); mp.CorrectMovePhoto = WriteableBitmapHelper.Clone(ppos); } else { ppos = b; } parc = RotateTrans(ppos, -arc); mp.CorrectRotatePhoto = WriteableBitmapHelper.Clone(parc); if (IsCorrectMoveScale) { float sd = SQLength / (b.PixelHeight * 0.1002f); this.ScaleNum = sd; r = ScaleTrans(parc, 1, 1); //进行缩放匹配 } else { r = parc; } mp.CorrectScalePhoto = WriteableBitmapHelper.Clone(r); return(r); }
private int LatitudeBrightChange = 7; //可以被识别出来的亮度等级的亮度差 public override void BeginAnalyse() { IsAnalyse = true; mp.SelectedPhoto = WriteableBitmapHelper.Clone(CropPhoto); }//开始调试状态,主要是保存选取区域