Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.04.10;
Скачать: [xml.tar.bz2];

Вниз

сохранение JPEG из буфера обмена   Найти похожие ветки 

 
softi   (2011-01-10 12:56) [0]

Ерунда какая-то получается с банальным сохранением картинки в буфере обмена в 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;
Кто-нибудь сталкивался?


 
12 ©   (2011-01-10 13:02) [1]


> jpeg.Assign(image1.Picture.Bitmap);

тут наверное еще размеры надо задать


 
Virgo_Style ©   (2011-01-10 13:50) [2]

С чем-то таким сталкивался. Как бы не соврать, но попробуйте

 JPG.JPEGNeeded;
 JPG.Compress;


перед SaveToFile


 
softi   (2011-01-10 16:15) [3]


> > jpeg.Assign(image1.Picture.Bitmap);тут наверное еще размеры
> надо задать

В том-то и штука, что оно работает, но лишь при
jpeg.Grayscale:=false;
и при jpeg.pixelformat:=jf24bit;


 
DiamondShark ©   (2011-01-10 17:47) [4]


> softi   (10.01.11 16:15) [3]

JPEG не бывает Grayscale и не поддерживает глубину цвета, отличную от 24 бит. Формат такой. Зачем вы пытаетесь его замучить?


 
DVM ©   (2011-01-10 21:06) [5]


> JPEG не бывает Grayscale и не поддерживает глубину цвета,
>  отличную от 24 бит.

Бывает


 
Дмитрий Белькевич   (2011-01-11 00:05) [6]


> JPEG не бывает Grayscale и не поддерживает глубину цвета,
>  отличную от 24 бит. Формат такой. Зачем вы пытаетесь его
> замучить?


Это частные реализации не бывают и не поддерживают, поэтому ставь

>jpeg.Grayscale:=false;и при jpeg.pixelformat:=jf24bit;

потому что оно так написано.


 
softi   (2011-01-11 09:36) [7]

Если "так написано", тогда зачем вообще существуют такие свойства в классе TJpegimage?


 
Ega23 ©   (2011-01-11 10:11) [8]


> Если "так написано", тогда зачем вообще существуют такие
> свойства в классе TJpegimage?


Очевидно, это расписано в хелпе, не?


 
Дмитрий Белькевич   (2011-01-11 10:30) [9]


> Если "так написано", тогда зачем вообще существуют такие
> свойства в классе 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."

Сохранение - не единственное действие у объекта. И вообще - читай маны, они - рулез.


 
Anatoly Podgoretsky ©   (2011-01-11 11:30) [10]


> This property affects how the image is displayed.

Вот это подтверждает, "JPEG не бывает Grayscale и не поддерживает глубину цвета, отличную от 24 бит" - это только для показа, а показывают не JPEG, а битмап. Виндоус ничего другого не поддерживает, кроме BGR/RGB


 
softi   (2011-01-11 14:34) [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."

Если я правильно понял, то оно должно работать!


 
Sapersky   (2011-01-11 18:25) [12]

"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-12 12:39) [13]

Получается, что даже казалось бы общепринятые и затертые до дыр компоненты имеют свои глюки... :(


 
Ega23 ©   (2011-01-12 12:43) [14]


> Получается, что даже казалось бы общепринятые и затертые
> до дыр компоненты имеют свои глюки... :(


Где ты глюк увидел?


 
softi   (2011-01-12 12:50) [15]


> Где ты глюк увидел?

выше последнего сообщения не читал что ли?
А если есть что-то по сути, оспорь.


 
Ega23 ©   (2011-01-12 13:02) [16]


> выше последнего сообщения не читал что ли?


смотри внимательно:

> 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-13 15:51) [17]

В общем, все возможно.

Вот рабочий код:

   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шке имеем нужную глубину цвета...


 
Дмитрий Белькевич   (2011-01-13 16:41) [18]


> Получается, что даже казалось бы общепринятые и затертые
> до дыр компоненты имеют свои глюки... :(


В чём глюк? Реализация такая. И это везде в винде так, кроме сторонних библиотек. Даже если ты 8-битный (или 12/16 битный на канал) джипег сделаешь, его нечем смотреть будет.


> Похоже, вся фишка в том, что сначала надо установить опции,
>  а потом ассоциировать jpg с graphic.


Как ни крути - на выходе будет 24-битный цвет. А реально цветное оно, или нет - это уже дело десятое. Тебе, как я понял, именно 8 бит нужно? Или опять неверная постановка задачи и "задача xyz"?


 
softi   (2011-01-13 16:59) [19]

Мне не обязательно было в 8бит сохранить. Просто жутко интересно возникло, почему не получается. Опция есть, а не получается...

Все, как я уже написал выше, все решено. Всем спасибо! Тема закрыта.


 
Sapersky   (2011-01-13 18:53) [20]

Винда-то здесь причём? Я б ещё понял если бы GDI+ обсуждали, но TJpegImage - точно такая же сторонняя библиотека, как и прочие. Не умеет распаковывать grayscale jpeg в 8 битный битмап - её персональные проблемы. IJL умеет.
Irfanview тоже открывает grayscale jpeg, например этот:
http://s2.ipicture.ru/uploads/20110113/zAV532uF.jpg
как 8-битную картинку.


 
Дмитрий Белькевич   (2011-01-14 22:19) [21]


> И это везде в винде так, кроме сторонних библиотек


Имелось в виду, что джипеговые либы, которые в винде, тоже 8 бит не умеют. Да и сторонние - не все, это тоже верно.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.04.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.004 c
2-1294643049
Mitroshin
2011-01-10 10:04
2011.04.10
Как включить в FastReport показ миниатюр по умолчанию?


15-1293014298
Медвежонок ХМЛ
2010-12-22 13:38
2011.04.10
Взлетит или не взлетит?


1-1251978398
gosha52
2009-09-03 15:46
2011.04.10
Delphi 2009-2010, утекает память в записях


4-1247134941
istok20
2009-07-09 14:22
2011.04.10
CreateProcessAsUser error


15-1291411633
Nic
2010-12-04 00:27
2011.04.10
Недорогой телефон с сенсорным экраном





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский