WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Smartare algoritm (https://www.wn.se/forum/showthread.php?t=1054772)

klein 2012-09-01 13:12

Smartare algoritm
 
Koden ( PHP ) nedan fungerade följande :

$H1 & $W1 innehåller faktiskt höjd och bredd på bilden .
$MaxW & $MaxH Innehåller begärd höjd och bredd på bilden.

Det koden gör, är att den skalar ner bilden så den får rätta propositionerna.. Så begär man att bilden skall vara 250 och 250 px stor, testar den sej fram till en storlek som blir mer korrekt utseende mässigt.

Nu till frågan, ett smartare sätt att lösa problemet på än det jag har gjort här nedan. Här nedan så plocka jag bort 0,05% av bilden pixel och test mig fram i en loop.

Kod:

$MaxW        = $filedata[3];                // Max storleken på bilden i W
                                $MaxH        = $filedata[4];                // Max storleken på bilden i H
       
                                $H1                = $imgInfo[0];                // Riktig storleken på bilden H
                                $W1                = $imgInfo[1];                // Riktig storleken på bilden W
                                $x=0;                       
                                        do {
                                                $W1        =        $W1*.95;
                                                $H1        =        $H1*.95;
       
                                                        if ( $W1 < $MaxW && $H1 < $MaxH || $x > 100 ) break;

                                                        $x++;

        } while ( 1 );


nosnaj 2012-09-01 16:51

Varför beräknar du inte den nya bildens storlek direkt utan loopen?
Eller var inte syftet att skala ned bilden till rätt storlek, din kod kör ju bara approximationer med 0.05% minskning hela tiden vilket känns som en skum lösning.

Conny Westh 2012-09-01 22:28

Jag förstår inte heller varför en vanlig division inte skulle räcka för att ändra skalan, har jag missat något?

klein 2012-09-02 02:40

Svar till båda :

Grejen är att jag vet inte vad nya h och w skall vara, jag vet begärt max värde på bilden, säg att användare begär att bilden max får vara 250 & 250 , medan bilden är i verkligheten 2100 & 3000 .

Jag vill då att nya W & H skall vara så nära 250 & 250 som möjligt, därav har jag gjort * .95 i loopen. Så hur beräknar man fram nya W & H utan att loopa? ( Kanske där min tanke miss finns ? )

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20448941)
Jag förstår inte heller varför en vanlig division inte skulle räcka för att ändra skalan, har jag missat något?


Danski 2012-09-02 11:10

Kanske missförstår jag men det där verkar vara en väldigt komplicerad, tung och oexakt lösning på ett väldigt enkelt problem?

Testa nått i denna stilen:
//Värden på bild och maxvärden på skalad bild
W1 == 2100
H1 == 3000
MaxW == 250
MaxH == 250

//Dela nuvarande mått med önskade mått för att få fram skalan, använd det högsta värdet till att skala med
W1 / MaxW -> 8.4
H1 / MaxH -> 12

//Dela med 12 och vips så är dina nya mått 175x250
2100/12 -> 175
3000/12 -> 250

pelmered 2012-09-03 16:44

Såhär kanske (otestad kod):
PHP-kod:

$curRatio $W1/$H1;
$maxRatio $MaxW/$MaxH;

if(
$curRatio $maxRatio)
{
 
$newW $MaxW;
 
$newH $currH * ($MaxW/$W1);
}
else
{
 
$newH $MaxW;
 
$newW $currW* ($MaxH/$H1);



klein 2012-09-04 07:23

Helt rätt tänkt.. Fungera utmärkt.

Citat:

Ursprungligen postat av Danski (Inlägg 20448985)
Kanske missförstår jag men det där verkar vara en väldigt komplicerad, tung och oexakt lösning på ett väldigt enkelt problem?

Testa nått i denna stilen:
//Värden på bild och maxvärden på skalad bild
W1 == 2100
H1 == 3000
MaxW == 250
MaxH == 250

//Dela nuvarande mått med önskade mått för att få fram skalan, använd det högsta värdet till att skala med
W1 / MaxW -> 8.4
H1 / MaxH -> 12

//Dela med 12 och vips så är dina nya mått 175x250
2100/12 -> 175
3000/12 -> 250


dAEk 2012-09-04 22:40

Hur hanterar ni fall där ratio-beräkningarna inte blir exakta? Jag gör liknande beräkningar men en del bilder som skalas ned blir 199px när jag sätter maxdimensionerna till 200. Det beror på castningar från double till int. Vet ni några bra sätt att lösa det på förutom att göra fula if-else-kontroller och lägga till tomma pixlar?

Ni borde ha samma problematik i era varianter ovan.

pelmered 2012-09-05 08:49

Citat:

Ursprungligen postat av dAEk (Inlägg 20449263)
Hur hanterar ni fall där ratio-beräkningarna inte blir exakta? Jag gör liknande beräkningar men en del bilder som skalas ned blir 199px när jag sätter maxdimensionerna till 200. Det beror på castningar från double till int. Vet ni några bra sätt att lösa det på förutom att göra fula if-else-kontroller och lägga till tomma pixlar?

Ni borde ha samma problematik i era varianter ovan.

Det beror dels på att det är en begränsning i hur många decimaler PHP kan hantera och att PHP gör om siffrorna till base 2 internt. Läs mer om det i Floating point precision-varningen här: http://www.php.net/manual/en/language.types.float.php
Den andra anledningen är att när man castar till Int kapar de väl bara bort decimalerna (dvs kör en floor(), t.ex. 5,6 => 5). För att det ska bli rätt är det bara att köra ceil() eller round() för att få hela pixlar innan du castar till Int(om du nu måste det).

dAEk 2012-09-05 20:49

Jag var nog bara trött när jag skrev det där med avrundningen och måste ha stirrat mig blind på måtten och sett att det fanns bilder som saknade 1px på bredden. I efterhand ser jag att de ju faktiskt hållt sig inom måtten som jag specade men att maxhöjden har uppnåtts före maxbredden; att det fattades 1px beror alltså inte på ett algoritmfel utan på ursprungsbildernas dimensioner. Doh!


Alla tider är GMT +2. Klockan är nu 03:11.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson