Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: TJPEGImage глючит  (Прочитано 28341 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« : 01-10-2007 12:33 » 

  Добрый день!

  У меня возникла проблема с TJPEGImage. Я делаю вот что:

1. Сохраняю картинку из канвы в BMP файл на диск.
2. С помощью специальной программы (таковы уж условия заказчика) конвертирую BMP в JPG и результат снова открываю с помощью TJPEGImage.
  Но при выводе на экран картинка превращается в набор черно-белых полосок Жаль   Что характерно, любой просмотровщик открывает ее нормально! Но TJPEGImage не в состоянии это сделать.
  Если кто-то сталкивался с подобной проблемой или же знает в чем может быть причина, то я буду безумно благодарен за помощь!

Вот пример такой картинки (11Кб):
http://rapidshare.com/files/59461751/NewFile.jpg.html

Программа-конвертор покупная и 100% рабочая (называется 2JPEG), к тому же любые другие bmp-файлы конвертируются замечательо и правильно открываются. Проблема возникает только при конвертации битмапов, которые создает Делфи (типа, Bitmap.SaveToFile()) и анимированных гифов Улыбаюсь
« Последнее редактирование: 01-10-2007 12:43 от HempStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 04-10-2007 09:30 » 

HempStar, файл, который указан в ссылке, - нормальный, там мужик  в чёрной броне
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 04-10-2007 11:16 » 

HempStar, возможно дело в параметрах bmp: число цветов, сжатие и т.п.
Я сталкивался с неправильной работой программ с bmp 256 цветов - перекодировка в 24-битный цвет сняла все вопросы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 04-10-2007 12:15 » 

Лучше было бы выложить "неправильный" битмап.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #4 : 05-10-2007 03:50 » 

Джон, так HempStar и выложил неправильный битмап. То есть, если его просматривать в Delphi с помощью класса TJpegImage, то получается фигня.
HempStar, я пробовал менять параметры TJpegImage - картинка чуть лучше стала если PixelFormat:=jf8Bit, но при этом цвета отображаются криво. Думаю, что в данном случае класс TJpegImage неприемлем.
« Последнее редактирование: 05-10-2007 03:53 от zubr » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 05-10-2007 10:16 » 

Джон, так HempStar и выложил неправильный битмап.

Хде битмап??? Быть такого не может Я только jpeg вижу. А эт я так понимаю уже после конвертирования "специальной программой".
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #6 : 05-10-2007 14:28 » 

Джон, ты правильно понимаешь. А битмап - это имеется в виду графический файл.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 05-10-2007 15:38 » 

А что jpeg это не графический файл? Ага

zubr, в силу утверждения

Проблема возникает только при конвертации битмапов, которые создает Делфи (типа, Bitmap.SaveToFile()) и анимированных гифов Улыбаюсь

необходимо, как минимум, анализировать полученный "неправильный" битмап, а не перелопаченную алгоритмом сжатия инфу. Как максимум - алгоритм создания этого битмапа. Ведь всё остальное работает правильно.

В силу
Джон, так HempStar и выложил неправильный битмап.

могу только предположить, что браузер тупит и я линк не вижу?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #8 : 05-10-2007 16:17 » 

Джон, там в линке надо с рапидшары скачать. В общем выкладываю архив с 2-мя файлами: jpg и bmp. jpg - это файл полученный после сжатия bmp-файла автором темы с помощью специальной программы 2JPEG, bmp - это файл, полученный при конвертации, с использованием борландского класса TJpegImage, из jpg-файла. Кстати в Delphi этот jpg виден так же криво как и полученный bmp.

* Bitmap.zip (40.44 Кб - загружено 1095 раз.)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 05-10-2007 18:28 » 

zubr, я так понял, что проблема как раз с битмапом созданным в дельфи, дальнейшая конвертация тут скорее всего роли не играет. Ведь он говорит, что другие файлы работают нормально. Те я делаю заключение навскидку, что именно сохранение загадочной "канвы" в битмап и приводит к подобному эффкту. Я конечно с Дельфями знаком постольку-поскольку. Но битмап он и в Африке битмап. А заморочки с ним известны с доисторических времён. Вот и хотел взглянуть чего там Дельфи сохраняет. МОжет поэтому и jpeg-алгоритм не срабатыват.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 06-10-2007 03:25 » 

канвой они вроде девайс контекст окна обзывают
Записан

zubr
Гость
« Ответ #11 : 06-10-2007 06:54 » 

Джон, попробую объяснить.
В Delphi есть классы TBitmap и TJpegImage.
Класс TBitmap, при инициализации создает новый битмап (CreateBitmap, CreateCompatibleBitmap). У него есть удобные свойства и методы: SaveToFile, SaveToStreame, SaveToClipboard, LoadFromFile, LoadFromStreame, LoadFromClipboard. Для связи с битовыми матрицами GDI Windows имеется свойство Handle. В общем для того чтобы отобразить bmp-файл на оконном элементе с помощью данного класса это можно сделать 2-мя строчками кода.
Класс TJpegImage внешне (оболочкой) похож на TBitmap, правда исходники на него, в отличие от TBitmap Borland не предоставляет. В общем данный класс позволяет загружать, сохранять, конвертировать jpeg-изображения. Для конвертации из bmp-файла в jpg-файл и обратно достаточно нескольких строчек кода:
Код:
var
  bmp:TBitmap;
  jpg:TJpegImage;
begin
 bmp:=TBitmap.Create;
 jpg:=TJpegImage.Create;
 bmp.LoadFromFile('C:\File.bmp');
 jpg.Assign(bmp);
 jpg.SaveToFile('C:\File.jpg');
 bmp.Assign(jpg);
 bmp.SaveToFile('C:\NewFile.bmp');
end;
Проблема мне видится в разных алгоритмах сжатия, используемых дельфийским классом TJpegImage и программой 2JPEG, используемой автором темы, для конвертации из bmp в jpeg. То есть если сделать как в коде выше, то все будет нормально и NewFile.bmp получится корректный. Но в данном случае получается следующее:
Код:
var
  bmp:TBitmap;
  jpg:TJpegImage;
begin
 //конвертация File.bmp->File.jpg программой 2JPEG
 bmp:=TBitmap.Create;
 jpg:=TJpegImage.Create;
 jpg.LoadFromFile('C:\File.jpg');
 bmp.Assign(jpg);
 bmp.SaveToFile('C:\NewFile.bmp');
end;
После такой конвертации NewFile.bmp уже кривой.
Кстати, сама IDE Delphi (имеется в виду редактор свойств для вставки графических файлов) файл сконвертированный программой 2JPEG отображает криво.
Алексей1153++, канвас может быть у окна, тогда действительно это контекст устройства. Канвас есть и у класса TBitmap, но это созданный совместимый контекст устройства.

« Последнее редактирование: 06-10-2007 06:55 от zubr » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 06-10-2007 12:12 » 

Ситуация немного проясняется. Я не думаю, что Дельфи сама работает с битмапом - скорее всего используется враппер АПИ ф-ций. Тк сам битмап в порядке, и jpeg тоже. Если открыть его например в пайнте и сохранить как битмап, то всё в порядке. Другое дело работа с объектом TJPEGImage. Обычно под виндой  объекты типа IPicture или библиотека gdi+ используют установленные в системе кодеки - в основном с ИЕ, другими словами, что может ИЕ, то могу и я. Что делает с ним Дельфи - неясно. НО похоже, что проблема именно в этом объекте - в TJPEGImage. Тк как я теперь правильно понял если открыть jpeg-файл, то сразу видны полоски. Тогда и понятно, что они сохраняются в битмапе.

Очень может быть что программа 2JPEG использует новый алгоритм jpeg2000. А вобщето у jpeg куча настроек и как можно им сжимать не указывая эти параметры, одной только ф-ей Save - непонятно. Лучше воспользоваться готовыми библиотеками. Или посмотреть какие возможности есть у 2JPEG.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #13 : 06-10-2007 15:33 » 

Джон, у TJPEGImage есть несколько свойств, позволяющих менять параметры jpeg перед сохранением, в частности CompressionQuality, позволяющуь менять степень сжатия, а также PixelFormat, позволяющий устанавливать 8 или 24 бита на пиксел. Кстати при 8-битном формате эта картинка получается без полосок, но цвета не соответствуют оригиналу.
Насчет нового алгоритма jpeg2000 - пробовал этот файл открывать в древней версии ACDSee - файл просматривается корректно. Ведь как-то ACDSee да и другие графические программы умеют правильно читать этот файл. Я, к сожалению, jpeg-формат не знаю (все порывался изучить, да все времени не хватает), а дело, думаю, скорее всего в различиях форматов заголовков файлов.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 06-10-2007 16:15 » 

Мм... в данном случае речь не в сохранении, а в открытии файла сохранённого другой программой. Кстати ради интереса. Что происходит, если подсунуть TJPEGImage jpeg-и созданные например в Фотошопе или Паинте? Или какой другой программой?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #15 : 07-10-2007 04:52 » 

Открывал файл NewFile.jpg в Паинте, Асдси, Microsoft foto editor, делал сохранить как, сохранял в jpg файл без каких то новых настроек (настройки по умолчанию), после этого TJPEGImage корректно с новым файлом работает.
Записан
booratino
Новенький

ru
Offline Offline

« Ответ #16 : 02-04-2012 09:06 » new

Но при выводе на экран картинка превращается в набор черно-белых полосок Жаль   

BlackStar, 5 лет спустя.... ты победил его? мне тоже интересно как....  Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines