Hogyan készítsünk egy pixel átlátható hozzáférést a képpontokhoz - a tűz majomot a-tól i-ig
Egy cross-platform alkalmazást írok. A keresés eredménye a TGrid-ban jelenik meg. Arra a kérdésre volt szükség, hogy egy képet mutasson az egyik oszlopban.
A Windows-on minden rendben van, de a táblagépen egyszerűen csodák vannak: az első kijelzőn minden rendben van, de ha csak lefelé és lefelé haladsz, amikor a képeket mások dörzsölik, akkor a rész általában fejjel lefelé jelenik meg.
A kép mentésének kódja (jpg) az adatbázisba:
ha hozzárendelt (sm), akkor kezdődik sm.Position: = 0; //TBlobField(dmData.cdsPlayerData.FieldByName('Photo')).LoadFromStream(sm); vImage: = TImage.Create (nil); próbálja sm.Position: = 0; vImage.Bitmap.LoadFromStream (sm); vKoef: = vImage.Bitmap.Height / 64; vImage.Bitmap.Resize (TRUNC (vImage.Bitmap.Width / vKoef), TRUNC (vImage.Bitmap.Height / vKoef)); sm.Free; sm: = TMemoryStream.Create (); próbálja meg a vImage.Bitmap.SaveToStream (sm) parancsot; TBlobField (dmData.cdsPlayerData.FieldByName ( 'SmallPhoto')) LoadFromStream (sm) .; végül sm.Free; végén; végül vImage.Free; végén; végén; A görgetésig:
Megpróbálta mind a LiveBinding-ot, mind a kézi rajzot - az eredmény ugyanaz. Bármely ötlet, mi a baj?
Ui Tudom, hogy mit kell tenni a TListView segítségével, de az ügyfél "hasonlóan szeretne a régi programban", hiszen az android csak a tablettákon fog működni - állapítottam meg.
Üdvözlünk!
A feladat feltölteni a fotókat és megjeleníteni őket a listán. Úgy tűnik, mint két ujj, de.
A kód hosszú ideig működött, mindent betöltve és megjelenített. Egy idő után a fotók nem voltak betöltve. A hibakeresés egy zárt végtelen hurokot mutatott be ebben az eljárásban:
eljárás TBitmap.AssignFromSurface (const Forrás: TBitmapSurface); var BitmapData: TBitmapData; MaxSize: Integer; Újramintott felület: TBitmapSurface; I: Integer; SourceRect: TRectF; kezdődik a MaxSize: = CanvasClass.GetAttribute (TCanvasAttribute.MaxBitmapSize); <-- MaxSize = 0 if (Source.Width> MaxSize) vagy (Source.Height> MaxSize), majd indítsa el a SourceRectet: = TRectF.Create (0, 0, Source.Width, Source.Height); SourceRect.Fit (TRectF.Create (0, 0, MaxSize, MaxSize)); ResampledSurface: = TBitmapSurface.Create; próbáld meg a ResampledSurface.StretchFrom (Forrás, Trunc (SourceRect.Width), Trunc (SourceRect.Height), PixelFormat); AssignFromSurface (ResampledSurface); <-- infinity loop here finally ResampledSurface.Free; end; end else begin SetSize(Source.Width, Source.Height); if Map(TMapAccess.Write, BitmapData) then try for I := 0 to TBitmapSurface(Source).Height - 1 do Move(TBitmapSurface(Source).Scanline[I]^, BitmapData.GetScanline(I)^, BitmapData.BytesPerLine); finally Unmap(BitmapData); end; end; end; В самом начале процедуры MaxSize получает значение 0 (ноль!), размеры картинки больше нуля и процедура влетает в бесконечный цикл на строке
AssignFromSurface (ResampledSurface);
Valaki szembenézett? Vannak gondolatok, hogyan kell kezelni?
Köszönöm mindenkinek!
Jó napot. Van egy probléma, amellyel már nem tudtam megbirkózni több hete. Van egy régi kód a WinAPI alatt, újra kell újítani az Androidot a firemonkey segítségével. És a fő probléma az, hogy van egy kód, amely a saját formátumából a HBITMAP-ot a WinAPI-ból teszi. Valójában ez az a szerkezet, ahol az utolsó mező a bitekre mutató mutatók. Könnyen átdolgozható, létrehozva saját példányát egy ilyen struktúrából. De most le kell fordítanom a TBitmapre, és nem igazán értem, hogyan kell csinálni.
Gyakran, amikor rajz a vásznon bittérkép módszert alkalmazzuk DrawBitmap, ahol, különösen, mint egy érv meg kell határoznia a téglalap régió a forrás (SrcRect) és a vevő (DestRect). Ezek a négyszögek rögzítési formátummal rendelkeznek (balra, jobbra, jobbra, alulra).
Amikor az egész bitképet az egész SrcRect-ről, mint az Osipov űrlapján és könyvében meghatározták, a következő bejegyzést láttam:
RectF (0,0, ABitmap.Width, ABitmap.Height) De a logika azt diktálja, hogy ez legyen a méret a bitmap 1 pixel mind vízszintesen, mind függőlegesen több mint amilyen valójában, hiszen az első pixel koordinátái (0, 0) és az utolsó (ABitmap.Width, ABitmap.Height). Amely valószínűleg torzuláshoz vezet, amikor egy bittérképet jelenít meg a vászonon.
Úgy gondolom, hogy egy teljes bitkép rajzolásakor ilyen módon kell írni:
RectF (0,0, ABitmap.Width-1, ABitmap.Height-1) Jó vagy rossz? Ha nem, miért?
Hello, barátok!
Mondd el nekem, hogy a maximális sebességgel hogyan határozhatja meg a kép hiányát a TBitmap-ban?
Ie - TBitmap. Tele van képzel (kép), vagy teljesen fekete téglalap.
Hogyan tudhatja meg, mi a kép benne? Ie - NEM feltétlenül fekete téglalap.
És meghatározni, hogy "azonnal" (feltételesen szólva) szükséges.
Előre mindenki hálás a részvételért!
Ui Az alábbiakhoz hasonló opciók - nem kínálnak)) "gyorsan" szeretnék valamit! Köszönjük ismét!
funkció IsBitmapEmpty (Bmp: TBitmap): logikai; var X, Y. Integer; BmpData: TBitmapData; yAddr. integer; AlphaCount. integer; kezdődik Eredmény: = hamis; próbáld AlphaCount: = 0; Bmp.Map (TMapAccess.Read, BmpData); Y esetén: = 0 - Bmp.Height div 2 kezd YAddr: = Y * Bmp.Height; X: = 0 - Bmp.Width - 1 ha (PAlphaColorArray (BmpData.Data) ^ [YAddr + X] <> TAlphaColorRec.Null) és (PAlphaColorArray (BmpData.Data) ^ [YAddr + X] <> TAlphaColorRec.Black), majd írja be inc (AlphaCount); break; végén; ha AlphaCount> 0 majd Break; végén; végül Bmp.Unmap (BmpData); Eredmény: = AlphaCount = 0; végén; végén;
Delphi Seattle, Android 5.0.1
A képet a ScanLine segítségével alkotom. A kimeneten az eredményül kapott bitkép a TImage-on van rajzolva, amelyen a Rect előzőleg rajzolt.
A GlobalBitmap generált tbitmap.
az ObjectPreviewImage.Bitmap.Canvas elindítja a BeginScene alkalmazást; Tiszta (TAlphaColorRec.White); DRect: = TRectF.Create (0, 0, GlobalBitmap.Width + 8, GlobalBitmap.Height + 8); DrawRect (DRect, 0, 0, AllCorners, StealthForm.ObjectPreviewImage.AbsoluteOpacitás); DRect: = TRectF.Create (0, 0, GlobalBitmap.Width, GlobalBitmap.Height); DrawBitmap (GlobalBitmap, DRect, TRectF.Create (2, 2, GlobalBitmap.Width + 2, GlobalBitmap.Height + 2), 1); EndScene; végén;
A probléma valójában az, ami - az Android verzióban a bal és a keret alatt a "megesett". A Win32 verzióban minden rendben van. A mellékelt képernyőképeken jól látható.
Olvastam a dokumentációt, google.
Mit csinálok rosszul? Vagy az orrfestés ismeretlen veszteségei a vásznon?
Ui A kép ugyanaz, a szín egy bizonyos területen nem megfelelően lett felvéve. Kampány is android viccek. De már foglalkozom ezzel.
P.P.S. Már kitalálta a színt - az android Kék és Piros alatt a pixelben, meg kell cserélni. És a vászonról - nem működik semmilyen módon.
P
Már egy nap "fagyott".
Az iDHTTP-t használom (az iDHTTP szintén "dobta" az űrlapot és dinamikusan hozta létre az eredményt) és a TMemoryStream.
A kód alább található.
Az eszközön lévő alkalmazás hibát ad: A hozzáférési jog megsértése az 559E45CC címen a 00000000 címen érhető el
A hibakereső kiadja: osztályszegmentációs hiba 11
Empirikusan megállapított, hogy a hiba valószínűleg bekövetkezik, amikor megpróbál, hogy töltse TMemoryStream (próbáltam TMemoryStream.LoadFromFile - ugyanaz a dolog, bár TListViewItem.BitMap.LoadFromFile alkalmazás ugyanazt a fájlt megy a bumm, és minden jól működik).
Hogyan jeleníthet meg szöveget egy képen, így menthető .jpg formátumban.
Ui Nincs képszöveg a képhez.
OS X tesztelés - Mountain Lion 10.8.3
A Map / Unmap-update kép után a TImage3D 3D formátumú kép nem frissül.
Itt van egy egyszerű példa - TestMap.zip - az időzítő feljegyzi a zajt a TImage3D.Bitmap.
Az XE7 alatt Win32 és OSX alatt működik.
Az XE8 alatt a win32 alatt működik, és az OSX alatt fehér háttér jelenik meg. Ha az űrlapot egy másik ablak rajzolja, akkor ezen a helyen a kép, azaz annak része (a mi esetünkben a zaj). Ugyanez érvényes arra az esetre is, ha a formanyomtatványunk ki van húzva a képernyőn, és visszahúzódott - az űrlap megjelenésekor megjelenik egy képünk (zaj) egy része.
A BeginUpdate / EndUpdate és a Repaint nem adott eredményt.
Az XE8 Update1 ugyanaz.
Hogyan lehet legyőzni ezt?
(A normál TImage jól működik).
Most a 6. oldalon a felhasználók
Nincsenek felhasználók, akik ezt az oldalt látják