Întrebarea # 4 076 ... delphi atipic! Trebuie să afișez o imagine JPEG printr-o comp ...

Bună ziua, dragi cunoscători ai Delphi!

Trebuie să afișeze o imagine de tip JPEG prin TImage componentă (ca substrat pentru o vectorizer manuală simplă). În principiu, totul este de lucru, dl Oja dintr-o dată se confruntă cu faptul că nu pot obține mărimea absolută a JPEG-imagine în centimetri (extras din măruntaiele de rezoluție TImage „pixeli la ceva“ sau dimensiunea pixeli absolută în timp ce, de asemenea, nu funcționează).

Spuneți-mi cum să rezolvați această problemă.

Cu recunoștință față de toți cei care vor răspunde,
Vitali

Forum cu mini-întrebări

Pentru a face acest lucru, trebuie să știți rezoluția ecranului (pixel / inch) vertical și orizontal pentru monitorul curent. Aceasta se face folosind funcția GetDeviceCaps ().

Fac laboratoare și tutoriale despre Delphi și Turbo Pascal. Pentru bere! Scrieți în mod personal și, de preferință, în ICQ. Și chiar mai bine - sunați la Skype!

Am încercat să o fac așa cum recomandă min @ y ™. Cu toate acestea, următorul fragment de cod produce rezoluții zero pentru monitor, atât vertical cât și orizontal.
Același lucru se întâmplă dacă cereți permisiunea de pe desktop.
Fac ceva în neregulă?

Bifarea "dovada citirii" este un rău universal.

La sfatul lui Vadim K a schimbat codul în acest fel
și, în consecință, așa
Zero-urile sunt încă returnate. În buclă, am asigurat că ambii operatori de alocare sunt de fapt executați. Poate că eu sunt exact "mânerul" dispozitivului înlocuit incorect?

Recoltat, că este posibil să încercați Monitoare [i] .PixelsPerlnch
așa cum se poate vedea din numele - la numărul de puncte pe inch. Amintiți-vă că centimetrul este de 25,4 mm, puteți merge cu ușurință la sistemul metric.

Bifarea "dovada citirii" este un rău universal.

La sfatul lui Vadim K a schimbat codul în acest fel
(proprietatea PixelsPerlnch este definită în clasa TScreen și nu se află în clasa TMonitor). Având în vedere această corecție, funcționează, dar mărimea absolută a imaginii este determinată incorect.

Mai precis, în acest fel, obțin rezoluția ecranului (96), iar în proprietățile fișierului JPEG rezoluția este de 300 de pixeli pe inch (aceeași este prezentată de PhotoShop).

de ce oamenii vin cu "simplificarea" întrebării lor.
Ei bine, nu trebuie să faci asta. Și nu veți primi "răspunsuri greșite".

Să spunem doar că, atunci când este afișată o imagine, ea poate fi afișată ca pixel la un pixel sau luând în considerare rezoluția specificată în interiorul fișierului. clasa TJPEGImage are o proprietate dpi, care ar trebui să vă arate mult-așteptatul 300.


Fișierul bmp nu are conceptul de dpi și se pierde atunci când este încărcat dintr-un fișier jpg. (mai exact, poate fi folosit pentru a scala imaginea la boot).

Bifarea "dovada citirii" este un rău universal.

Vadim K a scris: Ei bine, de ce oamenii vin cu "simplificarea" întrebării lor.

În versiunea originală a întrebării am întrebat cum să obținem dimensiunea absolută a imaginii în orice unitate sau în pixeli la o unitate absolută. Probabil că am ceva incorect formulat, dar, din păcate, încă nu înțeleg ce este.

A schimbat codul ca acesta
Sa dovedit că obiectul clasei TJPEGImage atribuit Image.Picture.Graphic nu are proprietatea dpi, care poate se datorează particularităților Delphi-7, pe care le folosesc.

Poate fi posibil să se primească alți parametri și pe baza lor să se calculeze acest lucru?

Imaginea desenată pe ecran nu are nici o dimensiune în interior. Puteți încerca să o numărați dacă știți dimensiunea în pixeli și setările monitorului.

Pentru o imagine salvată într-un fișier, poate fi un astfel de parametru. Dar, în unele cazuri, este lipsit de sens. De ce? Ei bine, de exemplu, o imagine scanată, atunci puteți înțelege, aici dpi are sens. Dar fotografia vederii de pe fereastră nu mai are sens, deoarece este imposibil să faceți o corespondență (gândiți-vă puțin, veți înțelege de ce). Dar, în cazul unei fotografii a Pământului din spațiu, poate avea deja sens.

hResol: = (Imagine.Picture.Grafică ca TJPEGImage) .dpi;

Citiți cu atenție mesajul meu anterior, care spune de ce acest lucru nu va funcționa.

Bifarea "dovada citirii" este un rău universal.

Dacă am înțeles corect ideea lui Vadim K. după atribuirea imaginii JPEG Image.Picture.Graphic o dată ce a fost transformată, parametrii inițiali sunt apoi pierduți (nu sunt stocați în adâncimea instanței unei componente a tipului TImage).

Cu toate acestea, înainte de această problemă "avansată", nu am reușit. Aici este codul modificat, care este corect din acest punct de vedere.
El se împiedică exact unde este codul anterior
În ambele cazuri, la etapa de compilare, mi sa spus că proprietatea dpi nu este definită.

În ceea ce privește proprietatea dpi, nu am Delphi la îndemână. poate că m-am înșelat - nu-mi amintesc nimic. Dar este dificil să faceți clic pe punctul după jpeg și să vedeți lista de proprietăți?


Nu scrie așa. Aceasta este o scurgere de memorie. utilizați atribuiți

Bifarea "dovada citirii" este un rău universal.