![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сохранение JPEG из буфера обмена
softi © (2011-01-10 12:56:00)Ерунда какая-то получается с банальным сохранением картинки в буфере обмена в jpeg-формат:
Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHan dle(cf_Bitmap), 0);
jpeg:=tjpegimage.Create;
try
jpeg.Assign(image1.Picture.Bitmap);
jpeg.CompressionQuality:=65;
case RadioGroup1.ItemIndex of
0: jpeg.pixelformat:=jf8bit;
1: jpeg.pixelformat:=jf24bit;
end;
jpeg.Grayscale:=true;
jpeg.SaveToFile('d:\proba.jpg');
finally
jpeg.Free;
end;
end;
на выходе файл весом в 0 байт... :(
почему-то не работает при jpeg.Grayscale:=true;
и при jpeg.pixelformat:=jf8bit;
Кто-нибудь сталкивался?
Дмитрий Белькевич (2011-01-14 22:19:00) [1]
> И это везде в винде так, кроме сторонних библиотек
Имелось в виду, что джипеговые либы, которые в винде, тоже 8 бит не умеют. Да и сторонние - не все, это тоже верно.
Sapersky (2011-01-13 18:53:00) [2]Винда-то здесь причём? Я б ещё понял если бы GDI+ обсуждали, но TJpegImage - точно такая же сторонняя библиотека, как и прочие. Не умеет распаковывать grayscale jpeg в 8 битный битмап - её персональные проблемы. IJL умеет.
Irfanview тоже открывает grayscale jpeg, например этот:
http://s2.ipicture.ru/uploads/20110113/zAV532uF.jpg
как 8-битную картинку.
softi (2011-01-13 16:59:00) [3]Мне не обязательно было в 8бит сохранить. Просто жутко интересно возникло, почему не получается. Опция есть, а не получается...
Все, как я уже написал выше, все решено. Всем спасибо! Тема закрыта.
Дмитрий Белькевич (2011-01-13 16:41:00) [4]
> Получается, что даже казалось бы общепринятые и затертые
> до дыр компоненты имеют свои глюки... :(
В чём глюк? Реализация такая. И это везде в винде так, кроме сторонних библиотек. Даже если ты 8-битный (или 12/16 битный на канал) джипег сделаешь, его нечем смотреть будет.
> Похоже, вся фишка в том, что сначала надо установить опции,
> а потом ассоциировать jpg с graphic.
Как ни крути - на выходе будет 24-битный цвет. А реально цветное оно, или нет - это уже дело десятое. Тебе, как я понял, именно 8 бит нужно? Или опять неверная постановка задачи и 'задача xyz'?
softi (2011-01-13 15:51:00) [5]В общем, все возможно.
Вот рабочий код:
Jpg:=TJPegImage.Create;
try
Jpg.CompressionQuality:=100;
jpg.Grayscale:=CheckBox1.checked; //галочка Ч/Б
Jpg.Assign(image1.Picture.Graphic);
Jpg.SaveTofile('d:\proba.jpg');
finally
Jpg.Free;
end;
Похоже, вся фишка в том, что сначаланадо установить опции, а потом ассоциировать jpg с graphic.
jpg.pixelformat:=jf8bit; - это, действительно, не работает, все равно получается 24 бита
Другое дело, если решать вопрос так:
if Clipboard.HasFormat(CF_BITMAP) then begin
Image1.Picture.Assign(Clipboard);
case radio_colors.ItemIndex of // выбираем опцию
0: t:=pf1bit;
1: t:=pf4bit;
2: t:=pf8bit;
3: t:=pf16bit;
4: t:=pf24bit;
5: t:=pf32bit;
end;
image1.Picture.Bitmap.PixelFormat:=t;
end;
тогда в BMPшке имеем нужную глубину цвета...
Ega23 (2011-01-12 13:02:00) [6]
> выше последнего сообщения не читал что ли?
смотри внимательно:
> Anatoly Podgoretsky © (11.01.11 11:30) [10]
> > This property affects how the image is displayed.
>
> Вот это подтверждает, "JPEG не бывает Grayscale и не поддерживает
> глубину цвета, отличную от 24 бит" - это только для показа,
> а показывают не JPEG, а битмап. Виндоус ничего другого
> не поддерживает, кроме BGR/RGB
Вот в TIFF-формате, ЕМНИП, в древние времена было поле BigEndian-LittleEndian для совместимости с MAC OS (там байты в другом порядке шли). Так вот, хоть уписайся, но порядок чтения байт ты процессору задать не сможешь.
Сумбурно что-то вышло, ну да ладно.
softi (2011-01-12 12:50:00) [7]
> Где ты глюк увидел?
выше последнего сообщения не читал что ли?
А если есть что-то по сути, оспорь.
Ega23 (2011-01-12 12:43:00) [8]
> Получается, что даже казалось бы общепринятые и затертые
> до дыр компоненты имеют свои глюки... :(
Где ты глюк увидел?
softi (2011-01-12 12:39:00) [9]Получается, что даже казалось бы общепринятые и затертые до дыр компоненты имеют свои глюки... :(
Sapersky (2011-01-11 18:25:00) [10]"Use Grayscale for reading in and writing out, that is, for decompressing and compressing, a jpeg image.
This property affects how the image is displayed"
Хелпы тоже не идеальны, здесь аффтар сам запутался.
Правильный ответ: 8-битный grayscale jpeg существует, и нормальные библиотеки (напр. IJL) его поддерживают. Как с этим у TJpegImage - не в курсе.
Но вообще можно не париться и использовать вместо grayscale цветной jpeg. Разница в размерах несущественная - у 24-битного на ч/б картинке цветные каналы сжимаются почти в 0. Разница в скорости когда-то, возможно, имела значение, сейчас - нет (при "бытовом" применении, если не нужна сверхэффективная оптимизация).
softi (2011-01-11 14:34:00) [11]
> "Use Grayscale for reading in and writing out, that is,
> for decompressing and compressing, a jpeg image. This property
> affects how the image is displayed. GrayScale is used for
> speed in output optimization. When Grayscale is set to true,
> the color is separated from luminosity. Color takes the
> most time to decompress, so for previewing the image, Grayscale
> can be set to true for speed. The output then contains 255
> shades of gray."
Если я правильно понял, то оно должно работать!
Anatoly Podgoretsky (2011-01-11 11:30:00) [12]
> This property affects how the image is displayed.
Вот это подтверждает, "JPEG не бывает Grayscale и не поддерживает глубину цвета, отличную от 24 бит" - это только для показа, а показывают не JPEG, а битмап. Виндоус ничего другого не поддерживает, кроме BGR/RGB
Дмитрий Белькевич (2011-01-11 10:30:00) [13]
> Если "так написано", тогда зачем вообще существуют такие
> свойства в классе TJpegimage?
Ну вот хотя бы из хэлпа:
"Use Grayscale for reading in and writing out, that is, for decompressing and compressing, a jpeg image. This property affects how the image is displayed.
GrayScale is used for speed in output optimization. When Grayscale is set to true, the color is separated from luminosity. Color takes the most time to decompress, so for previewing the image, Grayscale can be set to true for speed. The output then contains 255 shades of gray."
Сохранение - не единственное действие у объекта. И вообще - читай маны, они - рулез.
Ega23 (2011-01-11 10:11:00) [14]
> Если "так написано", тогда зачем вообще существуют такие
> свойства в классе TJpegimage?
Очевидно, это расписано в хелпе, не?
softi (2011-01-11 09:36:00) [15]Если "так написано", тогда зачем вообще существуют такие свойства в классе TJpegimage?
Дмитрий Белькевич (2011-01-11 00:05:00) [16]
> JPEG не бывает Grayscale и не поддерживает глубину цвета,
> отличную от 24 бит. Формат такой. Зачем вы пытаетесь его
> замучить?
Это частные реализации не бывают и не поддерживают, поэтому ставь
>jpeg.Grayscale:=false;и при jpeg.pixelformat:=jf24bit;
потому что оно так написано.
DVM (2011-01-10 21:06:00) [17]
> JPEG не бывает Grayscale и не поддерживает глубину цвета,
> отличную от 24 бит.
Бывает
DiamondShark (2011-01-10 17:47:00) [18]
> softi (10.01.11 16:15) [3]
JPEG не бывает Grayscale и не поддерживает глубину цвета, отличную от 24 бит. Формат такой. Зачем вы пытаетесь его замучить?
softi (2011-01-10 16:15:00) [19]
> > jpeg.Assign(image1.Picture.Bitmap);тут наверное еще размеры
> надо задать
В том-то и штука, что оно работает, но лишь при
jpeg.Grayscale:=false;
и при jpeg.pixelformat:=jf24bit;
Virgo_Style (2011-01-10 13:50:00) [20]С чем-то таким сталкивался. Как бы не соврать, но попробуйте
JPG.JPEGNeeded;
JPG.Compress;
перед SaveToFile