Skalowanie bitmap

0

WItam
Jestem początkującym programistą C++ więc proszę o wyrozumiałość.
Zależy mi na załadowaniu na formularzu kliku bitmap o wymiarach szerokośc 1200 i wys 12000 pix.Wrzucułem komponent TImage.Rozmiary są za duże więc trzeba by je przeskalować proporcjonalnie,tak by miesciły sie na ekranie formularza.Zależy mi na tym,zeby przeprowadzić pewne operacje ale nie na obrazie przeskalowanym tylko na oryginale(skalowanie jest tylko dla wizualnego wygladu dla uzytkownika).Te operacje na oryginale to zaznaczanie myszka fragmentu bitmapy i wyliczanie średniej i odchylenia standardowego-ale kolejne etapy pracy.CZy moge to zrobic w jakis taki sposob,ze na poczatku wczytuję bitmapę do jakiegoś bufora(tablicy),następnie algorytm ją skaluje i wyświetla w komponencie Timage.Po wyświetleniu zaznaczam na przeskalowanym obrazie pewien obszar ale w rzeczywistości wszystkie obliczenia żeby wykonywały sie na tablicy(użytkownik może o tym nie wiedzieć).Proszę o jakieś informacje na ten temat,czy mogę tak zrobić ,ew jakieś fragmenty kodu.
Z góry dziękuję
C++4programmers

0

CZy moge to zrobic w jakis taki sposob,ze na poczatku wczytuję bitmapę do jakiegoś bufora(tablicy)

Użyj klasy TBitmap jako buffora.

0

A może cos więcej panowie??

0

google, google, google...

0

twoja bitmapa w najgorszym razie to 1200 * 12000 * 4bajty czyli cos kolo 55MB pamieci, jezeli komponent nie chce tego wczytac to zamiast tluc wszystko w jedna wielka tablice bo 55MB ciaglego obszaru to trudno w pamieci znaleŹĆ, mozesz alokowac pamiec dla kazdego wiersza osobno, wtedy masz 12000 wskaznikow do obszarow np: po 1200 * 4 bajty, fragmentacja jest spora ale to sie da wczytac szybko jedyna trudnos to trzymanie tablicy wskaznikow i do wszelkich operacji musisz stosowac funkcje typu getpixel itp gdyz dzialanie na calych fragmentach moze byc trudne.

0

To już lepiej skorzystać z mapowania plików - wygodniejsze w użyciu. CreateDIBSection daje taką możliwość.

PS. nie zauważyłem, że jest tam 12 000. W tym wypadku TBitmap to raczej złe rozwiązanie.

0
  1. musisz miec komponent OpenPictureDialog1a nastepnie otwierasz obrazek

if(OpenPictureDialog1->Execute())
{
Form2->Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
int width = Form2->Image1->Picture->Width;
int height = Form2->Image1->Picture->Height;
}
2. pozniej chasasz po obrazku :)
for(int i = 0; i < height; i++)
{
ProgressBar1->StepBy(1);
for (int j = 0; j < width; j++)
{
OdczytajPixel(Form2->Image1->Canvas->Pixels[i][j],red1,green1,blue1);//zczytujesz kolorki
}
}
3.funkcja do czytania kolorkow

TForm1::OdczytajPixel(TColor rgb, int & red, int & green, int & blue)
{
red = ((unsigned int)(rgb & 0x000000FF ));
green = ((unsigned int)(rgb & 0x0000FF00 )) >> 8;
blue = ((unsigned int)(rgb & 0x00FF0000 )) >> 16;
return rgb;
}

  1. no i jak cos tam zrobisz z pixelem to zapisujesz go :)
    TColor TForm1::UtworzPixel(int red, int green, int blue )
    {
    return TColor(blue * 256*256 + green * 256 + red);
    }

pozdr
nie trzeba google,google...... :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1