Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.16;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.046 c
15-1194809006
vasIZmax
2007-11-11 22:23
2007.12.16
О мэйле


1-1191076411
KemSnake
2007-09-29 18:33
2007.12.16
Изменение цвета и размера полосы прокрутки TStringGrid.


1-1190356105
KokocIK
2007-09-21 10:28
2007.12.16
Прокрутка роликом в ScrollBox


4-1180097579
buben
2007-05-25 16:52
2007.12.16
Замена буфера обмена


10-1141661852
Alex Kryuchkov
2006-03-06 19:17
2007.12.16
СОМ через SSL-соединение