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

Вниз

Чтение изображения   Найти похожие ветки 

 
Suchair   (2007-09-25 20:58) [0]

Здрасьте.

Вобщем есть файл, в нем записано монохромное изображение с глубиной цвета 16 бит (2 байта на пиксель) подряд(без заголовков итд). как можно отобразить его на форме?
Спасибо.


 
Dib@zol ©   (2007-09-25 21:04) [1]

Оч просто. Читаешь ReadFile"ом файл и на выходе получаешь пойнтер на первый байт, с именем скажем Р. Читаешь байты Р и Р+1 и прибавляешь 2 к Р. И так до конца файла. Только нахрена собсно тратить на монохромный пиксель 2*8=16 бит, когда можно обойтись одним битом? И ещё - разрешение картинки как будешь определять? Или оно известно заранее?


 
tesseract ©   (2007-09-25 21:30) [2]


> когда можно обойтись одним битом? И ещё - разрешение картинки
> как будешь определять? Или оно известно заранее?


Разрешение фиксированное, изображение не монохромное, а GrayScale. Читаеться в массив Word - он как раз два байта.


 
Anatoly Podgoretsky ©   (2007-09-25 21:37) [3]

GrayScale это 8 бит + палитра
А 16 бит это R5G5B5 или R5G6B5 без палитры


 
Suchair   (2007-09-25 21:44) [4]

да, ошибся, изображение не монохромное. 2^16 градаций серого.
разрешение фиксированное.
считать его можно разными способами, а вот как его отобразить на форме то что считано.
TImage вроде не подходит, или у меня руки кривые....


 
homm ©   (2007-09-25 21:47) [5]

> [4] Suchair   (25.09.07 21:44)

А ты преобразу то, что считано в 256 отенков серого на лету прямо.


 
Anatoly Podgoretsky ©   (2007-09-25 22:07) [6]

> Suchair  (25.09.2007 21:44:04)  [4]

> 2^16 градаций серого.

Не возможно по определению, для RGB и для палитр.


 
Anatoly Podgoretsky ©   (2007-09-25 22:07) [7]

> homm  (25.09.2007 21:47:05)  [5]

Ты про GrayScale или именно про оттенки?


 
Suchair   (2007-09-25 22:18) [8]

я про оттенки. на один пиксель отведено 2 байта.

но проблема то не в том как кодируется изображение.

считать два байта для каждого пикселя и получить значение яркости этого пикселя не проблема. даже преобразовать значение яркости из 0..2^16 к 0..255 тоже не проблема.
не получается нарисовать пиксель.


 
Pavia ©   (2007-09-25 22:35) [9]

для отоброжения тебе надо преобразовать в 256 гродаций серого. Просто взять каждый второй байт.

А вывод делается просто
Image1.Picture.Bitmap:=TBitmap.Create;
Image1.Picture.Bitmap.PixelFormat:=pf8bit; //или 24 бит или 32бита

Image1.Picture.Bitmap.Width:=Width;
Image1.Picture.Bitmap.Height:=Height;

Установка пикселя делается так
Image1.Canvas.Pixel[x,y]:=Color;
или так
Image1.Picture.Bitmap.ScanLine[(Height-y-1)*Len+x]:=Color;

PS. Писал прямо здесь без проверки.


 
homm ©   (2007-09-25 22:41) [10]

> [6] Anatoly Podgoretsky ©   (25.09.07 22:07)
> Не возможно по определению, для RGB и для палитр.

Что не возможно? Формата такого быть не может? Или отобразить нелзя? И то и другое — чушь.


> [7] Anatoly Podgoretsky ©   (25.09.07 22:07)
> Ты про GrayScale или именно про оттенки?

А чем термин на английском языке отличается от термина на русском?


 
Suchair   (2007-09-25 23:04) [11]

to Pavia
Так не получается.
вот код который я пробовал:

var
x:integer;
begin
Image1.Picture.Bitmap:=TBitmap.Create;
Image1.Picture.Bitmap.PixelFormat:=pf8bit;
for x:=0 to 255 do
Image1.Canvas.Pixels[x,1]:=x;
end;
ничего при этом не происходит. Компонент Image как был пустым так и остался.

если закоментировать строки:
Image1.Picture.Bitmap:=TBitmap.Create;
Image1.Picture.Bitmap.PixelFormat:=pf8bit;

то в компоненте Image появляется ряд точек от черного до красного. а мне надобы белый


 
Anatoly Podgoretsky ©   (2007-09-25 23:05) [12]

> homm  (25.09.2007 22:41:10)  [10]

Еще раз GrayScale - это 8 бит с палитрой
Оттенки серого это когда R=G=B


 
Anatoly Podgoretsky ©   (2007-09-25 23:07) [13]

Что не возможно? Формата такого быть не может? Или отобразить нелзя? И то и другое — чушь.
Не может быть 2^16 серого ни для RGB - R=G=B, ни для GrayScale - палитра всего имеет 256 вхождений


 
homm ©   (2007-09-25 23:12) [14]

> [13] Anatoly Podgoretsky ©   (25.09.07 23:07)
> Не может быть 2^16 серого ни для RGB - R=G=B, ни для GrayScale
> - палитра всего имеет 256 вхождений

Что ждя вас есть сочетание этих 3-х букв? 3 компонента цвета, синий, красный, зеленый. В этиз 3-х буквах есть утверждение, что для хранения каждой компонеты используется 8 бит? Видмо нет. Тоже самое и для палитры. Никто не сказал, что она 8-и битная. Да и слова эти RGB и GrayScale Вы сам же и первый написали в [12].

Так что я еше раз апрашиваю, Формата такого быть не может? Или отобразить нельзя?


 
homm ©   (2007-09-25 23:13) [15]

> Что для Вас


 
homm ©   (2007-09-25 23:15) [16]

> [11] Suchair   (25.09.07 23:04)
> var
> x:integer;
> begin
> Image1.Picture.Bitmap:=TBitmap.Create;
> Image1.Picture.Bitmap.PixelFormat:=pf8bit;
> for x:=0 to 255 do
> Image1.Canvas.Pixels[x,1]:=x;
> end;

Image1.Repaint;


 
homm ©   (2007-09-25 23:23) [17]

procedure TForm1.FormCreate(Sender: TObject);
begin
 Image1.Picture.Bitmap := TBitmap.Create;
 with Image1.Picture.Bitmap do begin
   HandleType := bmDIB;
   PixelFormat := pf32bit;
   Width := 256;
   Height := 256;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
type
 ARGBQuad = array [0..0] of TRGBQuad;
 ASingle = array [0..512] of Single;
var
 i,j: Integer;
 Line: ^ARGBQuad;
begin
 for i := 0 to 255 do begin
   Line := Image1.Picture.Bitmap.ScanLine[i];
   for j := 0 to 255 do begin
     DWORD(Line[j]) := J or (J shl 8) or J shl 16;
   end;
 end;
 Image1.Repaint;
end;


 
Anatoly Podgoretsky ©   (2007-09-25 23:24) [18]

> homm  (25.09.2007 23:12:14)  [14]

У нас, для нас нет проблем с пониманием что такое цвет и форматы.


 
homm ©   (2007-09-25 23:26) [19]

> [18] Anatoly Podgoretsky ©   (25.09.07 23:24)

Отлично, тогда [0] перечитайте, и скажите, что Вас там не устраивает?


 
Suchair   (2007-09-25 23:31) [20]

получил ряд точек яркостью от 0 до 255

for x:=0 to 255 do
begin
c:=x*65793;
Image1.Canvas.Pixels[x,1]:=c;
end;

очень криво, но работает

щас попробую алгоритм homm-а


 
Anatoly Podgoretsky ©   (2007-09-25 23:31) [21]

> homm  (25.09.2007 23:26:19)  [19]

Меня все устраивает.


 
Suchair   (2007-09-26 02:36) [22]


> procedure TForm1.Button1Click(Sender: TObject);
> type
>  ARGBQuad = array [0..0] of TRGBQuad;
>  ASingle = array [0..512] of Single;
> var
>  i,j: Integer;
>  Line: ^ARGBQuad;
> begin
>  for i := 0 to 255 do begin
>    Line := Image1.Picture.Bitmap.ScanLine[i];
>    for j := 0 to 255 do begin
>      DWORD(Line[j]) := J or (J shl 8) or J shl 16;
>    end;
>  end;

>  Image1.Repaint;
> end;


что то я не пойму как работате эта процедура.
Поясните пожалуйста.


 
homm ©   (2007-09-26 06:35) [23]

> [22] Suchair   (26.09.07 02:36)

Всем компонентам цвета одного пикселя присваивается одинаковое значение. Строка
DWORD(Line[j]) := J or (J shl 8) or J shl 16;
делает то-же самое, что могли бы делать строки
    Line[j].rgbBlue := J;
    Line[j].rgbGreen := J;
    Line[j].rgbRed := J;

Просто на делает это эффективнее.


 
homm ©   (2007-09-26 06:46) [24]

> [21] Anatoly Podgoretsky ©   (25.09.07 23:31)

Почему не возможно существование 2^16 градаций серого по определению?


 
homm ©   (2007-09-26 06:49) [25]

> [24] homm ©   (26.09.07 06:46)

Вернее не так. По какому определеию не может быть «2^16 градаций серого»? По определеию термина «градаций серого»? Или по пределению слова «формат»?


 
Dimaxx ©   (2007-09-26 10:28) [26]


> > 2^16 градаций серого.
>
> Не возможно по определению, для RGB и для палитр.

Скорее всего это простое изображение с 256 оттенками просто "расширенное" до 16 бит (вот только зачем?). Либо это стандартное 15-битное изображение (5R+5G+5B). Разве нельзя представить в 15 битах серый цвет?

Автору. Попробуй считать массив в память, создать битмап известного тебе размера с глубиной цвета pf15bit и с помощью SetBitmapBits залить данные в картинку. Потом сохрани ее на диск и погляди что получится. Если получится белиберда - попробуй 16 бит (для эксперимента). Если и тут не получится - преобразовывай налету как предложил homm.


 
homm ©   (2007-09-26 11:32) [27]

> [26] Dimaxx ©   (26.09.07 10:28)
> Скорее всего это простое изображение с 256 оттенками просто
> "расширенное" до 16 бит (вот только зачем?).

Задачи, они разный бывают. Градацию серого 16 бит на писксель (или GrayScale, что одно и тоже, только на разных языках) иможно хранить например в PNG. Собственно PNG позволяет хранить и RGBA с 16 битами на канал (64-х битное изображение).


 
homm ©   (2007-09-26 11:45) [28]

> [27] homm ©   (26.09.07 11:32)
> Собственно PNG позволяет хранить и RGBA с 16 битами на канал (64-х битное изображение).

И ему, PNG, как-то пофиг на то, что «GrayScale это 8 бит + палитра, а 16 бит это R5G5B5 или R5G6B5 без палитры» и «2^16 градаций серого не возможно по определению».


 
Dimaxx ©   (2007-09-26 13:04) [29]

Кстати, по поводу Grayscale: я всегда удивлялся - зачем многие форматы (даже современные) хранят эту палитру?? Она же генерируется на раз-два.


 
Anatoly Podgoretsky ©   (2007-09-26 13:42) [30]

И кто тебе ее будет генерировать?


 
homm ©   (2007-09-26 13:56) [31]

> [30] Anatoly Podgoretsky ©   (26.09.07 13:42)
> И кто тебе ее будет генерировать?

Это какое отношение имеет к делу? Кто хочет пусть тот и генерирует. Автор описал задачу коротко и четко (не считая ошибки про монохромность).


 
Dimaxx ©   (2007-09-26 14:45) [32]


> И кто тебе ее будет генерировать?

Тот модуль или библиотека, которая поддерживает данный формат.


 
Anatoly Podgoretsky ©   (2007-09-26 15:12) [33]

Программ гигантское количество, включая доступ из разных браузеров, кто это будет делать? Зато все они умеют работать универсально с палитрами и безпалитровыми форматами типа RGB15, RGB16, RGB24, RGB32


 
homm ©   (2007-09-26 15:15) [34]

> [33] Anatoly Podgoretsky ©   (26.09.07 15:12)
> Программ гигантское количество, включая доступ из разных
> браузеров, кто это будет делать?

Что делать? Зачем делать? Что за каша у Вас в голове?


 
Anatoly Podgoretsky ©   (2007-09-26 15:17) [35]

homm ©   (26.09.07 15:15) [34]
Может быть перечитаешь тему и посмотришь кто предложил подобную бредовую вещь, поставлять изображение без палитры.


 
homm ©   (2007-09-26 15:23) [36]

> [35] Anatoly Podgoretsky ©   (26.09.07 15:17)

Может Вы, отвечая на пост, который был за 4 до вашего, хотя-бы номер его будете ставить?

И заодно признаете, что в [6] — чушь.


 
Anatoly Podgoretsky ©   (2007-09-26 15:47) [37]

> homm  (26.09.2007 15:23:36)  [36]

Я на тебе давно крест поставил. Аминь.


 
homm ©   (2007-09-26 15:50) [38]

> [37] Anatoly Podgoretsky ©   (26.09.07 15:47)

Оригинальный выход из положения, в котором не прав. Чем старше человек, тем труднее ему признать свои ошибки.


 
Anatoly Podgoretsky ©   (2007-09-26 16:09) [39]

> homm  (26.09.2007 15:50:38)  [38]

Не вижу никакого повода тратить время на тривиальные вещи, если человек и поста в поста не понимает.


 
Dimaxx ©   (2007-09-26 16:16) [40]


> Зато все они умеют работать универсально с палитрами и безпалитровыми
> форматами типа RGB15, RGB16, RGB24, RGB32

Я не о том. Я о том, зачем хранить палитру, которая представлена индексами цветов, компоненты которых равны между собой и равны индексу цвета! Например, Bitmap. Формат хранит палитровые (и без) изображения. Следовательно, можно было бы сделать (когда разрабатывали формат или что-то в этом роде) так, чтобы при чтении файла, если глубина цвета 8 бит на пиксель и палитра отсутствует, значит изображение Grayscale. C точки зрения оптимизации было бы неплохо. К остальным форматам это применимо в том же направлении. Я ни в коей мере не призываю переделывать форматы, просто я бы сделал так. И если я "разработаю" для своих нужд граф. формат - я сделаю именно так.



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

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

Наверх




Память: 0.55 MB
Время: 0.048 c
2-1195814196
Свой
2007-11-23 13:36
2007.12.16
TIdHTTPServer, ответ для клиента при закачке файла


2-1195620594
Klopan
2007-11-21 07:49
2007.12.16
Кнопка скрола в меню


2-1195640521
ZWNikolay
2007-11-21 13:22
2007.12.16
TTabControl


8-1171049042
Pa5ha
2007-02-09 22:24
2007.12.16
Скины


11-1181699539
Dosian
2007-06-13 05:52
2007.12.16
Ошибка в procedure ... message





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский