|
|
|
เกิดปัญหาเรื่องการ save ภาพ ของ file Stream (code C#) |
|
|
|
|
|
|
|
มันเกิดขึ้นประมาณว่า ถ้ารันเมือทำงานไปได้ขั้นตอนแรก-(sent email) เสร็จ ก็จะเกิด error ที่ AddFilter(img, "PicEnhance_1.bmp"); แล้วถ้าไม่มีการใช้ AddFilter(); ก็จะเกิด error ในส่วนของ FileStream ว่ามีการทำงานของโปรเซสอื่นอยู่ในการใช้ fileStream
Code (C#)
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
imgCapture.Image = imgVideo.Image;
SaveCap.SaveImageCapture(imgCapture.Image);
Bitmap img = new Bitmap(imgCapture.Image);
AddFilter(img, "PicEnhance_1.bmp"); // ถ้าใช้แบบนี้จะเกิดปัญหาตรงนี้
FileStream fs = new FileStream("C:\\Picture_1.bmp", FileMode.Open);
imgShow1.Image = Image.FromStream(fs);
fs.Close();
timer2.Enabled = true;
}
private void timer2_Tick(object sender, EventArgs e)
{
timer2.Enabled = false;
imgCapture.Image = imgVideo.Image;
Helper2.SaveImageCapture2(imgCapture.Image);
Bitmap img2 = new Bitmap(imgCapture.Image);
AddFilter(img2, "PicEnhance_2.bmp");
FileStream fs = new FileStream("C:\\Picture_2.bmp", FileMode.Open); // แล้วตรงนี้จะฟ้องว่ามีการใช้งานโดยส่วนอื่น
imgShow2.Image = Image.FromStream(fs);
fs.Close();
CompareImages();
if (Math.Abs(A1 - B1) >= 3)
{
SendMailAttTo(); //ส่ง email
B1 = A1;
}
timer1.Enabled = true;
}
//======================
private void AddFilter(Bitmap image, string fileName)
{
//Filter_GrayScale(image);
image.Save("C:\\" + fileName);
image.Dispose();
}
//======================
private void CompareImages()
{
FileStream fs;
fs = new FileStream("C:\\PicEnhance_1.bmp", FileMode.Open);
Bitmap bmp1 = new Bitmap(fs);
BitmapFilter.Contrast(bmp1, 30);
BitmapFilter.EdgeDetectDifference(bmp1, 20);
fs.Close();
File.Delete("C:\\PicEnhance_1.bmp");
bmp1.Save("C:\\PicEnhance_1.bmp");
fs = new FileStream("C:\\PicEnhance_2.bmp", FileMode.Open);
Bitmap bmp2 = new Bitmap(fs);
BitmapFilter.Contrast(bmp1, 30);
BitmapFilter.EdgeDetectDifference(bmp2, 20);
fs.Close();
File.Delete("C:\\PicEnhance_2.bmp");
bmp1.Save("C:\\PicEnhance_2.bmp");
Color c1, c2;
int width, height, diff;
diff = 0;
width = bmp1.Width; height = bmp1.Height;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
c1 = bmp1.GetPixel(i, j);
c2 = bmp2.GetPixel(i, j);
if (!c1.Equals(c2))
{
diff++;
}
}
}
progressBar1.Value = ((diff * 100) / 76800);
label1.Text = ((diff * 100) / 76800) + " %";
A1 = (int)progressBar1.Value;
}
Tag : - - - -
|
|
|
|
|
|
Date :
2010-05-31 05:09:09 |
By :
Takezeed |
View :
4473 |
Reply :
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
^ ^ เก่งนะคะ ช่วยแฟนทำ project ตลอด คราวต่อไปทำ project ตัวเองคงง่ายขึ้นละ
แฟนคุณโชคดีนะคะ มีคุณเอาใจใส่อย่างดีแบบนี้อะวันหลังให้เค้ามาโพสเองก็ได้มังคะ
งานเค้านี่ เห็นคุณโพสช่วยแฟนคุณตั้งกะเริ่มแรกละให้เค้ามาโพสเองดีกว่าค่ะ
เท่าที่สังเกตุ คุณเอ้ยแฟนคุณใช้ชื่อ File คงที่ตลอด เป็นไปได้ว่าจการเขียนไฟล์รอบแรกยังไม่เสร็จ
รอบสองก็มาถึงแล้ว เลยน่าจะ error ค่ะ ต้องบอกว่าน่าจะเป็นเพราะ ไม่มี source code ทั้งหมด
ของแฟนคุณ และถึงมีก็อาจจะ run ไม่ได้เพราะค่าต่างๆ ไม่เหมือนกัน
ลองให้แฟนคุณเปลี่ยนชื่อไฟล์ตามเวลาที่บันทึกหรือหาค่า counter เพื่อป้องกันการใช้ชื่อไฟล์เดิมน่ะค่ะ
ส่วน code น่าจะเขียนเองได้นะคะไม่อยากเลย แฟนคุณเก่งอยู่แล้วค่ะทำได้ค่ะ
ส่วนจะ error จาก GDI+ คงไม่น่าใช่เพราะใช้ BMP ธรรมดาๆ ซึ่งเป็นพื้นฐานอยู่แล้ว
อีกเรื่องนึงคือการทำ image processing นี่มี opensource library ให้กันมานานแล้วนะคะ
ไปนั่งอ่านสักนิดแล้วเอามาต่อยอด จะทำให้เขียนง่ายกว่ามั้ย อันนี้ก้อแนะนำค่ะ
ส่วนอยู่ตรงไหนก็ให้ถาม google นะคะ มากันเยอะเลย แต่ทั้งนี้อยู่ที่เวลาของ project
ว่ากำหนดส่งเมื่อไหร่ จะทันไหมไปปรึกษากันกะแฟนคุณสองคนค่ะ
ปล.ท่านผู้อ่านคนอื่นอาจจะสงสัยว่าทำไม บอกให้น้องเค้าไปปรึกษาแฟน
เพราะน้องคนนี้อยู่ปี 2 ค่ะ อยากช่วนแฟนที่เรียนปีสุดท้ายทำ project
เลยช่วยอำนวยความสะดวกมาตั้งแต่เริ่มทำละ
น้องเค้าเก่งมากเลย แต่ยังไงก็ให้แฟนน้องเค้าทำเองจะดีกว่าเพราะเป็นงานของเค้าเองเนอะ
|
|
|
|
|
Date :
2010-05-31 05:53:06 |
By :
blurEyes |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มันก็มีหลายวิธีนะที่จะแก้ปัญหา ทางที่ดีควรเก็บรูปเป็น memory stream ดีกว่าไม่ต้องเขียนเป็นไฟล์หรอก
เสร็จแล้วถ้ามีหลายรูปก็สร้าง list collection ให้กับ memory stream จะได้ใช้งานได้ง่ายๆ
ผมไม่รู้ว่ากล้องมันให้ output ออกมาเป็น steam หรือ file ถ้าเป็น stream ก็ add ลง collection ได้เลย
ส่วนถ้าเป็น file ก็ต้องแปลงเป็น steam ก่อน แล้วก็ลบไฟล์ทิ้งไปเลยก็ได้จะได้ไม่เปลืองพื้นที่
วิธีการแปลง file เป็น stream
// อ่าน binary file เก็บลง buffer
byte[] byteArray = File.ReadAllByte(@"C:\PicEnhance_1.bmp");
// เอา buffer เก็บลง memory stream
MomoryStream memoryStream = new MomoryStream(byteArray);
// เพิ่ม memory stream ลงใน collection
List<MomoryStream> Streamcollection = new List<MomoryStream>();
Streamcollection.Add(memoryStream);
แค่นี้ก็ไม่ตรงอ่านจากไฟล์แล้ว แก้ปัญหา process ซ้อน
ส่วน AddFilter นี่ใช่ทำรูปเป็นขาวดำ (ไม่ใช่ gray scale) หรือเปล่า ถ้าใช่ลองหาดูล่างๆ ตอบไว้เดือนกว่าๆ แล้ว
หาไม่เจอลองหาดู
|
|
|
|
|
Date :
2010-05-31 09:09:34 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ก็เห็นด้วยกับ blueeyes นะ น่าจะให้เขาเป็นตัวหลักเพราะนี่ก็งานเขา แต่ถ้ายินยอมลำบาก
ก็ไม่เป็นไร เป็นเรื่องส่วนตัวทางแก็งค์ไม่ขอยุ่ง ไปตกลงกันเอาเอง ส่วนเราก็ทำหน้าที่ของเรากันต่อไป
ก็คือตอบเกรียนๆ ไปวันๆ ฝึกมือหาความรู้เข้าตัวกัน มีสาระบ้างไม่มีบ้างกันตามประสาของเราเถิด
|
|
|
|
|
Date :
2010-05-31 09:56:44 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เขาทำเองคะ แค่หนูโพสในเว็บให้ เขาพูดให้หนูพิมพ์ ก็งงเหมือนกันว่าทำไมไม่สมัครมาถามเอง
ขอบคุณมากนะคะ
|
|
|
|
|
Date :
2010-06-01 00:47:16 |
By :
Takezeed |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
บัดนั้นถึงบัดนี้ ก็ยังไม่ได้อ่ะคะ พยายามหาข้อมูลก็ยังติดอ่ะคะ ใช้ collection ไม่เป็นด้วย พอจะมีเว็บให้ศึกษาเรื่อง stream memory กับ collection บ้างไหมคะ
|
|
|
|
|
Date :
2010-06-07 01:26:44 |
By :
Takezeed |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
https://www.thaicreate.com/dotnet/forum/043583.html
ตรง byte[] imageBytes = Security.DecryptStream......
ถ้าไม่ได้ encrypt ก็อ่านจาก file โดยตรงก็เปลี่ยนเป็น byte[] imageBytes = File.ReadAllBytes(InputFilePath);
แล้วก็ทำเป็น memory stream ได้เลย
|
|
|
|
|
Date :
2010-06-07 08:31:36 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เฮ้ย! ตูตอบไปแล้วนี่หว่าตั้งแต่ no.2 ยังไม่ได้อีกเหรอ
หรืองงเรื่อง list collection
การใช้ list มันคล้ายๆ array เราก็ใช้ index ในการอ้างอิง เช่น
Code (C#)
// เอา buffer เก็บลง memory stream
MomoryStream memoryStream = new MomoryStream(byteArray);
// เพิ่ม memory stream ลงใน collection
List<MomoryStream> Streamcollection = new List<MomoryStream>();
Streamcollection.Add(memoryStream);
//เวลาอ้างอิง
Streamcollection[0];
ถ้ามีเยอะๆ ก็วนลูปเอา
|
|
|
|
|
Date :
2010-06-07 09:14:03 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|