-
Привет мастерам!! Есть форма в нем TImage в нем можно посмотреть jpeg файлы. есть такие файл в которых изображение неправильно лежит его нужно повернут 90 градусов влево или в право или на 180 градусов. Как можно это сделать правильно.
-
Стандартными средствами нетрудно сделать - перевести jpeg в битмап, который уже вывести с поворотом. Если будет задача перекодировать файлы без ухудшения качества - то гуглить lossless jpeg rotation 90. Сам не смотрел, не пробовал, но у этого хлопца есть поддержка поворотов на 90*k http://www.simdesign.nl/nativejpg.html
-
В метаданных иногда указывается угол, под которым правильно смотреть.
-
в инете поискал но увы работающего кода не нашел
-
lossless jpeg rotation - см. pasjpeg. exif-тэг ориентации - вроде компонент называется TExif.
-
не получается
-
> Xmen (24.09.10 08:10) [5] > не получается
Что именно не получается? Распаковать жпег или повернуть распакованный битмап?
-
-
Всё-таки тэг поддерживают не все программы. Встроенный вьюер XP не поддерживает, у Irfanview нужно включать в опциях (но мало кто знает о существовании этой настройки). Получается так, что если для себя - используй тэг, а если хочешь показать картинки ещё кому-то - прилагай в комплекте "правильный" вьюер... Lossless transform в этом смысле надёжнее.
Хотя, у тэга есть ещё такое преимущество: фотоаппараты со встроенным датчиком ориентации (не самые дешёвые, мыльницы - от 8000 примерно) могут устанавливать правильный тэг автоматически.
-
Значит простого алгоритма для поворота изображения нет То что пишите по тегам и Lossless transform это выходит за рамки моих понимание.
-
> Xmen (27.09.10 08:43) [9] > Значит простого алгоритма для поворота изображения нет
Алгоритмов для поворота -- полно. Алгоритм поворота распакованного изображения кратно 90 градусам -- прост до неприличия.
Что уже ты пытался делать, и что конкретно не получилось?
-
Я хотел загрузит из базы в TImage Jpeg изображения. В изображениях хранится сканированный док файл. в некоторых случаях документы отсканированы боком. Чтобы почитать нормально нужно сделать поворот изображения. И еще некоторых изображение нужно уменьшит для просмотра.
-
тогда тут можно и сконвертить в обычный битмап
-
Procedure rotateImage; var bm, bm1: TBitMap; x, y: integer; r, a: single; xo, yo: integer; s, c: extended; begin bm := TBitMap.Create; bm.LoadFromFile('222.bmp'); xo := bm.Width div 2; yo := bm.Height div 2; bm1 := TBitMap.Create; bm1.Width := bm.Width; bm1.Height := bm.Height; a := 0; repeat for y := 0 to bm.Height - 1 do begin for x := 0 to bm.Width - 1 do begin r := sqrt(sqr(x - xo) + sqr(y - yo)); SinCos(a + arctan2((y - yo), (x - xo)), s, c); bm1.Canvas.Pixels[x,y] := bm.Canvas.Pixels[ round(xo + r * c), round(yo + r * s)]; end; Application.ProcessMessages; end; Form1.Canvas.Draw(xo, yo, bm1); a := a + 0.05; Application.ProcessMessages; until Form1.Tag <> 0; bm.Destroy; bm1.Destroy; end;
-
|