Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


torsdag den 18. oktober 2007

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

tirsdag den 9. oktober 2007

Den Gode Webservice

skrevet af Niels Brinch

Når der skal udarbejdes en webservice, er der som regel mindst to parter der skal være enige om hvordan den skal se ud. Dem der udarbejder webservicen og dem som skal anvende den. Normalt er det simpelt nok. Webservicen udarbejdes og dem der skal bruge den, kalder den med de parametre den forventer.

Men hvad så når der indgår flere parter? Hvad hvis alle parter udvikles uafhængigt af hinanden? Hvad hvis der skal være sikkerhed og tryghed om, at webservice-kald autentificeres og autoriseres pålideligt på tværs af flere systemer? Så er der brug for en fælles aftale om hvordan alting gøres.

Den aftale eksisterer allerede og hedder Den Gode Webservice (DGWS). Det er et projekt som er udarbejdet af MedCom.

MedCom er et samarbejde mellem myndigheder, organisationer og private firmaer med tilknytning til den danske sundhedssektor.

Selvom der står "sundhedssektor" har DGWS spredt sig til flere dele af det offentlige og andre, som enten ønsker, kræver eller forventer at webservice-kommunikation følger de retningslinjer som er beskrevet deri.

For .NET-udviklere er der en relativ simpel måde at komme i gang på. Der er udviklet en komponent samt en række værktøjer som er beregnet til at understøtte DGWS. Komponenten stille gratis til rådighed herfra. Hvis man følger de officielle links kommer man til at mangle en fil som ellers nævnes i dokumentationen. Den har jeg i stedet googlet mig frem til findes her.

Der er fremragende dokumentation og værktøjerne er ualmindeligt gode. "Desværre" kræver det stadig du har kendskab til webservices, WSSE og til Den Gode Webservice, så du kommer ikke udenom at læse det generelle dokument om DGWS som findes i det første link.

Her er meget overordnet forløbet for anvendelse af komponenten og værktøjerne:

1. Skriv en xsd som beskriver de parametre som skal kunne indgå i dine webservices.
2. Lad et værktøj automatisk generere en WSDL som overholder DGWS.
3. Lad et værktøj generere C#-kode som implementerer førnævnte WSDL.

...og så skal det egentlige arbejde selvfølgelig til at begynde.

1 kommentarer


 
Til forsiden

Niels Brinch

- Seneste indlæg