S výsledkem máš pravdu. Skutečně se to tak chová. Hledal jsem, hledal, a zjistil jsem věc, kterou jsem netušil - při kreslení na graphics se bere v potaz i rozlišení. (dpi) No a při vytvoření obrázku (bez nějakého prototypu) tak, jak tvoříš příkazem
Dim b2 As New Bitmap(320, 240)
se obrázku automaticky nastaví standardní rozlišovačka pro monitory, tzn. 96 DPi. No a pokud jsem si natáhnul obrázek s 300 dpi, tak Bitmapa b2 sice zůstane v původním rozměru (320 x 240 bodů) a vyplní tak celý příslušný PictureBox, jenomže při tom vykreslování na graphics
g.DrawImage(....
je graphics tak chytrý (nebo blbý, jak libo), že usoudí: Mám obrázek 300 (pro jednoduchost) pixelů široký, ale pochází ze zařízení, kde byla rozlišovačka 300 dpi, tedy fyzicky (při pozorování) měřil 1 palec na šířku. Nyní tento obrázek potřebuji vykreslit na zařízení, které umí pouze 96 dpi, tedy kdybych ho vykreslil stylem pixel = pixel, pak by fyzicky měřil 3,125 palců na šířku. Aby ale vypadal jako původně (šířka 1 palec), musím ho přepočítat z 300 na 96 pixelů na šířku. No a takto se nám nakreslí do levého horního rohu bitmapy b2 a zbytek bitmapy zůstane nevybarvený. Řešení: Jistě více, nalezl jsem 2 (mimo ten kód z předešlého příspěvku, který je jednodušší): 1) nastavit i u bitmapy b2 stejnou rozlišovačku, jakou má vstupní obrázek, třeba takto:
Dim b2 As New Bitmap(320, 240)
b2.SetResolution(b.HorizontalResolution, b.VerticalResolution)
Výsledek - dostaneš správné kousky obrázku, které budou mít nastavenou i rozlišovačku (dpi) stejnou, jaká je u zdrojového obrázku 2) vykašlat se na inteligenci graphics a natvrdo mu říci, na jak velkou část bitmapy (b2) má ten výřez nakreslit (samozřejmě mu zadáme, ať kreslí na celé b2). Třeba tak, že použiješ jiné přetížení metody DrawImage:
g.DrawImage(b, New Rectangle(0, 0, 320, 240), New Rectangle(X, Y, 320, 240), GraphicsUnit.Pixel)
' |-> cílový obdélník, kam to má roztáhnout (na celý b2)
' |-> zdrojový obdélník - výřez CO má vykreslit
Dostaneš opět správné výřezy, tentokrát ale budou mít standardní rozlišovačku (tedy 96 dpi pro monitor) bez ohledu na rozlišovačku původního obrázku
|