Find det bedste billede
skrevet af Niels Brinch
Man kan lægge videoer op på UploadBAG. Når videoerne lægges op, konverteres de til FLV-formatet og jeg danner en jpg så man kan se et billede fra videoen uden at starte den.
Problem: Jeg tager et billede 2 sekunder inde i videoen - der er den nogle gange ikke rigtig startet endnu, så bliver billedet helt sort.
Forkert løsning 1: Tag i stedet billedet 10 sekunder inde i filmen.
Nej, det kan også være den ikke er startet endnu der og det kan være at videoen skifter mellem to sekvenser og derfor er utydelig eller helt hvid eller sort.
Forkert løsning 1: Gennemgå alle billeder manuelt og tag nye billeder der hvor billedet ikke er blevet godt nok.
Nej, hvorfor gøre noget selv når man har en computer
Næsten rigtig løsning: Lad serveren tage 5 billeder forskellige steder i filmen og vælg det bedste.
Rigtig løsning: Lad serveren tage 5 billeder forskellige steder i filmen og lad serveren vælge det bedste.
Det er den fuldautomatiske løsning. Men hvordan kan serveren vide hvilket billede der er "bedst"? Det er jo subjektivt. Jeg baserer det på lysstyrke. Hvis det hverken er for lyst eller for mørkt er det sikkert et godt billede.
Jeg har derfor defineret følgende niveauer af billeder ud fra gennemsnitligt lys på et billede på en skala fra 0 til 255:
Niveau 1: Mellem 150 og 200
Niveau 2: Mellem 100 og 150, eller over 200.
Niveau 3: Det med den højeste lysstyrke som ikke hører under niveau 1 eller 2.
Og her lidt kode, så I tror på jeg virkelig har gjort det :)
private static int GetAverageLight(Bitmap image)
{
int aThirdWidth = (int)(image.Width / 3);
int aThirdHeight = (int)(image.Height / 3);
int middleWidth = (int)(image.Width / 2);
int middleHeight = (int)(image.Height / 2);
List<int> averages = new List<int>();
averages.Add(GetAverageLight(image.GetPixel(aThirdWidth, aThirdHeight)));
averages.Add(GetAverageLight(image.GetPixel(middleWidth, aThirdHeight)));
averages.Add(GetAverageLight(image.GetPixel(image.Width - aThirdWidth, aThirdHeight)));
averages.Add(GetAverageLight(image.GetPixel(aThirdWidth, middleHeight)));
averages.Add(GetAverageLight(image.GetPixel(middleWidth, middleHeight)));
averages.Add(GetAverageLight(image.GetPixel(image.Width - aThirdWidth, middleHeight)));
averages.Add(GetAverageLight(image.GetPixel(aThirdWidth, image.Height - aThirdHeight)));
averages.Add(GetAverageLight(image.GetPixel(middleWidth, image.Height - aThirdHeight)));
averages.Add(GetAverageLight(image.GetPixel(image.Width - aThirdWidth, image.Height - aThirdHeight)));
int total = 0;
foreach (int average in averages)
{
total += average;
}
return (int)((double)total / (double)averages.Count);
}
private static int GetAverageLight(Color color)
{
return (int)((double)(color.R + color.G + color.B) / (double)3);
}
Resultat kan ses på http://files.uploadbag.com ved at åbne en video.
0 kommentarer |