08. januar 2004 - 17:58
Der er
8 kommentarer og
1 løsning
System.Drawing laver grimme scaleringer.. hvorfor ?
Jeg er ved at lave et upload system ... efter man har uploadet et billede, skal det scaleres til 350 i breddenog converteres til jpeg, samt laves tumbnails...
Men hvorfor bliver billederne grimme og utydelige ??? er der noget man kan gøre for at forhindre dette ??? siden skal bruges til at modeller kan uploade billeder af dem selv, så det dur ikke de alle er grumset i ansigtet...
Jeg bruger GetThumbnailImage til begge scaleringer...
nogen der har en løsning ?=
08. januar 2004 - 21:43
#2
GetThumbNailImage er, som navnet antyder, kun til thumbnail.. og her er kvaliteten ikke særlig god. Du skal istedet manuelt sætte din Height og Width på billedet... så bliver det pænt scaleret.
08. januar 2004 - 21:56
#3
men hvordan scalere jeg det så ?
Jeg tænker på.. jeg har mit image objekt.. men hvilken funktion scalere ? jeg har læst noget om man kan bruge noget imagecodec og encoder stuff før man gemmer sit billede.. det skulle give de samme muligheder som med feks. Photoshop hvor man kan vælge en værdi mellem 1 og 100 til jpeg...
er der nogen der har nogle eksempler af det ?`
/Jacob Jensen
08. januar 2004 - 22:13
#4
scalering ?! det er da bare at sætte din height og width, så klarer gdi+ resten:
Image img = Bitmap.FromFile("bla.jpg");
img.Width = 350;
img.Height = // Ja, det må du så selv regne ud, for at billedet holder sin ratio
img.Save("bla_small.jpg")
11. januar 2004 - 14:13
#7
hm... well, så har jeg da en rutine til det som du kan bruge... bruges på denne måde:
Bitmap orig = //dit billede
Bitmap resized = Resize(orig, bredde, højde, false);
public static Bitmap Resize(Bitmap b, int nWidth, int nHeight, bool bBilinear)
{
Bitmap bTemp = (Bitmap)b.Clone();
b = new Bitmap(nWidth, nHeight, bTemp.PixelFormat);
double nXFactor = (double)bTemp.Width/(double)nWidth;
double nYFactor = (double)bTemp.Height/(double)nHeight;
if (bBilinear)
{
double fraction_x, fraction_y, one_minus_x, one_minus_y;
int ceil_x, ceil_y, floor_x, floor_y;
Color c1 = new Color();
Color c2 = new Color();
Color c3 = new Color();
Color c4 = new Color();
byte red, green, blue;
byte b1, b2;
for (int x = 0; x < b.Width; ++x)
for (int y = 0; y < b.Height; ++y)
{
// Setup
floor_x = (int)Math.Floor(x * nXFactor);
floor_y = (int)Math.Floor(y * nYFactor);
ceil_x = floor_x + 1;
if (ceil_x >= bTemp.Width) ceil_x = floor_x;
ceil_y = floor_y + 1;
if (ceil_y >= bTemp.Height) ceil_y = floor_y;
fraction_x = x * nXFactor - floor_x;
fraction_y = y * nYFactor - floor_y;
one_minus_x = 1.0 - fraction_x;
one_minus_y = 1.0 - fraction_y;
c1 = bTemp.GetPixel(floor_x, floor_y);
c2 = bTemp.GetPixel(ceil_x, floor_y);
c3 = bTemp.GetPixel(floor_x, ceil_y);
c4 = bTemp.GetPixel(ceil_x, ceil_y);
// Blue
b1 = (byte)(one_minus_x * c1.B + fraction_x * c2.B);
b2 = (byte)(one_minus_x * c3.B + fraction_x * c4.B);
blue = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));
// Green
b1 = (byte)(one_minus_x * c1.G + fraction_x * c2.G);
b2 = (byte)(one_minus_x * c3.G + fraction_x * c4.G);
green = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));
// Red
b1 = (byte)(one_minus_x * c1.R + fraction_x * c2.R);
b2 = (byte)(one_minus_x * c3.R + fraction_x * c4.R);
red = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));
b.SetPixel(x,y, System.Drawing.Color.FromArgb(255, red, green, blue));
}
}
else
{
for (int x = 0; x < b.Width; ++x)
for (int y = 0; y < b.Height; ++y)
b.SetPixel(x, y, bTemp.GetPixel((int)(Math.Floor(x * nXFactor)),(int)(Math.Floor(y * nYFactor))));
}
return b;
}