Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
1

Конвертер png -> jpeg

23.10.2014, 12:43. Показов 7164. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сейчас увидел тему во фрилансе ( png to jpeg)
нашел свой исходник и задумался правильно ли я делал? (хе2)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// сохраняю
procedure TForm1.Button1Click(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
    if FileExists(SavePictureDialog1.FileName) then
        raise Exception.Create('File already exists. Cannot overwrite.')
    else
      Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
end;
 
// загружаю
procedure TForm1.sbFromClick(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
или же SavePictureDialog1 не правильно будет конвертировать??

или вернее будет вот так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure PNGFileToBitmap(const Source, Dest: String);
var
  Jpg: TJpegImage;
  PNG: TPNGObject;
begin
  PNG := TPNGObject.Create;
  Jpg := TJpegImage.Create;
  {In case something goes wrong, free booth PNG and Bitmap}
  try
    PNG.LoadFromFile(Source);
    Jpg.Assign(PNG);    //Convert data into bitmap
    Jpg.SaveToFile(Dest);
  finally
    PNG.Free;
    Jpg.Free;
  end
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2014, 12:43
Ответы с готовыми решениями:

Разбор каждого пикселя с файлов Jpeg, bmp, gif, png
Здравствуйте, вот такая задача: есть структура и массив: Dpixel= packed record R:byte; ...

программа, работающая с файлами хтмл, док, jpeg, png,gif
Нужно написать программу, которая являлась бы хранилищем базы данных. Сама база представлена...

Написать консольный конвертер из .jpeg и .bmp в .png
Здравствуйте дорогие Форумчане :) Есть задание - написать консольный конвертер, который будет...

Resize JPEG, BMP, GIF, PNG --> JPEG
Доброго дня! Стала задача сделать ресайзер. Требования: картинка по соотношению вес/качество...

12
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
23.10.2014, 12:50 2
Цитата Сообщение от NotBeginner Посмотреть сообщение
или же SavePictureDialog1 не правильно будет конвертировать??
Диалог ничего не конвертирует, он просто позволяет выбрать имя файла.
Не нужно навязывать пользователю своих решений, вместо проверки существования файла и запрета сохранения поверх, достаточно [ofOverwritePrompt] в Options.
Конвертация из PNG в JPEG -- это довольно деликатная с точки зрения качества изображения операция, обязательно нужно предоставить пользователю регулятор степени сжатия результирующего JPEG.
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
24.10.2014, 12:08  [ТС] 3
quwy, зачем тогда их "наплодили" разве не достаточно одного TSaveDioalog?
Цитата Сообщение от quwy Посмотреть сообщение
Конвертация из PNG в JPEG -- это довольно деликатная с точки зрения качества изображения операция, обязательно нужно предоставить пользователю регулятор степени сжатия результирующего JPEG.
Как вариант -
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure PNGtoJPEG(const Source, Dest: String;  Quality: TJPEGQualityRange=100);
var
  Bitmap: TBitmap;
  PNG: TPNGObject;
  Jpg: TJpegImage;
begin
  PNG := TPNGObject.Create;
  Bitmap := TBitmap.Create;
  try
    PNG.LoadFromFile(Source);
    Bitmap.Assign(PNG); 
    Jpg := TJpegImage.Create;
    Jpg.CompressionQuality:=Quality;
    Jpg.Assign(Bitmap);
    Jpg.SaveToFile(ChangeFileExt(Dest, '.jpg' ));
  finally
    jpg.free;
    PNG.Free;
    Bitmap.Free;
  end
end;
PNG - BMP - JPEG

Добавлено через 3 минуты

Не по теме:

а когда в paint -e выбираем сохранить как - он тоже меняет только название но или конвертирует тоже??



Добавлено через 21 час 4 минуты
как определить что сконвертировалось верно?

Добавлено через 1 час 56 минут
на сколько точно вернет этот код

Delphi
1
2
3
4
5
6
7
8
9
function KindOfImage(Start: Pointer): String;
var
  PW: ^Word absolute Start;
  PL: ^DWord absolute Start;
begin
  result := 'UnKnow';
  if PL^ = $474E5089 then Result := 'PNG';
  if PW^ = $D8FF then Result := 'JPG'
end;
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
24.10.2014, 13:29 4
NotBeginner, забывайте уже по-немногу про absolute, тем более в таком совершенно его не требующем случае.
Delphi
1
2
3
4
5
6
7
8
9
function KindOfImage(const Start: Pointer): string;
begin
  if PCardinal(Start)^ = $474E5089 then 
    Result := 'PNG'
  else if PCardinal(Start)^ and $00FFFFFF = $00FFD8FF then 
    Result := 'JPG'
  else
    Result := 'Unknown';
end;
1
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
24.10.2014, 13:34 5
Зачем так меняеш функцию если написано и так правильно
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  TImageType = (NoImage, Bmp, Gif, Gif89, Png, Jpg);
 
function KindOfImage(Start: Pointer): TImageType;
begin
  if LongWord(Start^) = $38464947 then
  begin
    if (PChar(Start) + 4)^ = '9' then Result := Gif89
    else Result := Gif;
  end
  else if Word(Start^) = $4D42 then Result := Bmp
  else if LongWord(Start^) = $474E5089 then Result := Png
  else if Word(Start^) = $D8FF then Result := Jpg
  else Result := NoImage;
end;
Загружаешь в подходящий поток (TResourceStream, TFileStream, TMemoryStream) И считываешь несколько первых байт (2..6). По ним и смотришь какой файл загружен. Многие графические редакторы не полагаются на расширение файла, а проверяют первые байты.

Код
  {BMP}     ($42, $4D,   0,   0,   0,   0),
  {ICON}    (  0,   0,   1,   0,   0,   0),
  {CURSOR}  (  0,   0,   2,   0,   0,   0),
  {WAVE}    ($52, $49, $46, $46,   0,   0),
  {MIDI}    ($4D, $54, $68, $64,   0,   0),
  {JPG}     ($FF, $D8, $FF,   0,   0,   0),
  {GIF}     ($47, $49, $46, $38,   0,   0),
  {TIF}     ($49, $49, $2A, $00,   0,   0),
  {PNG}     ($89, $50, $4E, $47, $0D, $0A),
  {PCX}     ($0A, $05,   0,   0,   0,   0));
1
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
24.10.2014, 14:24  [ТС] 6
Игорь[Igor], как то так?
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
  img : TMemoryStream;
begin
  img := TMemoryStream.Create;
  img.LoadFromFile(fileName);
  case  KindOfImage(img.Memory) of
  0  :
  1  :
  2  :
  end;
end;
0
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
24.10.2014, 14:29 7
А что неработает?
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
24.10.2014, 14:35  [ТС] 8
работает.. просто может что то не так)
0
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
24.10.2014, 14:43 9
Все так
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
24.10.2014, 17:30 10
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
Зачем так меняеш функцию если написано и так правильно
Во-первых написано было не оптимально, а во-вторых, проверка на JPEG не соответствовала сигнатуре этого формата.
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
24.10.2014, 17:39  [ТС] 11
Цитата Сообщение от quwy Посмотреть сообщение
else if PCardinal(Start)^ and $00FFFFFF = $00FFD8FF then
можете пояснить эту строчку??

Добавлено через 6 минут
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
{BMP} * * ($42, $4D, * 0, * 0, * 0, * 0),
* {ICON} * *( *0, * 0, * 1, * 0, * 0, * 0),
* {CURSOR} *( *0, * 0, * 2, * 0, * 0, * 0),
* {WAVE} * *($52, $49, $46, $46, * 0, * 0),
* {MIDI} * *($4D, $54, $68, $64, * 0, * 0),
* {JPG} * * ($FF, $D8, $FF, * 0, * 0, * 0),
* {GIF} * * ($47, $49, $46, $38, * 0, * 0),
* {TIF} * * ($49, $49, $2A, $00, * 0, * 0),
* {PNG} * * ($89, $50, $4E, $47, $0D, $0A),
* {PCX} * * ($0A, $05, * 0, * 0, * 0, * 0));
почему формировать строку в обратном порядке, т.е
не $89$50$4E$47$0D$0A а $0A$0D$47$4E$50$89 ?
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
24.10.2014, 18:00 12
Цитата Сообщение от NotBeginner Посмотреть сообщение
можете пояснить эту строчку??
Сигнатура JPEG, как вы видите в таблице, имеет длину три байта. Но т.к. в Delphi нет 24-битного целого типа, то нужно взять 4 байта, отсечь старший из них битовым умножением на $00FFFFFF, и результат сравнить с трехбайтовой сигнатурой $FFD8FF (или $00FFD8FF, что одно и то же).

Добавлено через 3 минуты
Цитата Сообщение от NotBeginner Посмотреть сообщение
почему формировать строку в обратном порядке, т.е
Потому что архитектура x86 использует такой порядок байт, когда младший разряд многобайтовой переменной лежит по более низкому адресу в памяти (little-endian). Но если считать из файла 4 байта, то первый байт файла будет лежать по младшему адресу dword-переменной, т.е. порядок будет инвертирован.
1
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
26.10.2014, 12:52 13
Цитата Сообщение от quwy Посмотреть сообщение
Во-первых написано было не оптимально, а во-вторых, проверка на JPEG не соответствовала сигнатуре этого формата.
Я не тебе писал
0
26.10.2014, 12:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2014, 12:52
Помогаю со студенческими работами здесь

Jpeg или png ?
Вот я все видел в мире верстки. И табличные сайты в 2017м году, и выравнивание margin и прочее. ...

jpeg (png) в svg
Надо программно (С#) переконвертировать картинку в формате png или jpeg в формат svg. Некоторые...

Конвертация JPEG в PNG
(Просьба не переносить в раздел для начинающих) При конвертации изображения из JPEG в PNG...

Конвертер JPEG в ASCII-арт
Доброго времени суток, в Вузе на втором семестре дали курсовую по программированию. Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru