Главная страница
    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.005 c
11-1232967128
BMouradov
2009-01-26 13:52
2011.04.10
Выполнение команд до создания окна в МСК


15-1291298849
Медвежонок Пятачок
2010-12-02 17:07
2011.04.10
ну а в самом-то деле как на самом деле обстоят дела с азотом?


15-1293469266
Leon-Z
2010-12-27 20:01
2011.04.10
ISS.


2-1294948457
Oleg_teacher
2011-01-13 22:54
2011.04.10
Excel + Delphi совмесный доступ


2-1294720735
DROWSY
2011-01-11 07:38
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский