![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение изображения
Suchair © (2007-09-25 20:58:00)Здрасьте.
Вобщем есть файл, в нем записано монохромное изображение с глубиной цвета 16 бит (2 байта на пиксель) подряд(без заголовков итд). как можно отобразить его на форме?
Спасибо.
Anatoly Podgoretsky (2007-09-25 23:31:00) [21]> homm (25.09.2007 23:26:19) [19]
Меня все устраивает.
Suchair (2007-09-25 23:31:00) [22]получил ряд точек яркостью от 0 до 255
for x:=0 to 255 do
begin
c:=x*65793;
Image1.Canvas.Pixels[x,1]:=c;
end;
очень криво, но работает
щас попробую алгоритм homm-а
homm (2007-09-25 23:26:00) [23]> [18] Anatoly Podgoretsky © (25.09.07 23:24)
Отлично, тогда [0] перечитайте, и скажите, что Вас там не устраивает?
Anatoly Podgoretsky (2007-09-25 23:24:00) [24]> homm (25.09.2007 23:12:14) [14]
У нас, для нас нет проблем с пониманием что такое цвет и форматы.
homm (2007-09-25 23:23:00) [25]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;
homm (2007-09-25 23:15:00) [26]> [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:13:00) [27]> Что дляВас
homm (2007-09-25 23:12:00) [28]> [13] Anatoly Podgoretsky © (25.09.07 23:07)
> Не может быть 2^16 серого ни для RGB - R=G=B, ни для GrayScale
> - палитра всего имеет 256 вхождений
Что ждя вас есть сочетание этих 3-х букв? 3 компонента цвета, синий, красный, зеленый. В этиз 3-х буквах есть утверждение, что для хранения каждой компонеты используется 8 бит? Видмо нет. Тоже самое и для палитры. Никто не сказал, что она 8-и битная. Да и слова эти RGB и GrayScale Вы сам же и первый написали в [12].
Так что я еше раз апрашиваю, Формата такого быть не может? Или отобразить нельзя?
Anatoly Podgoretsky (2007-09-25 23:07:00) [29]Что не возможно? Формата такого быть не может? Или отобразить нелзя? И то и другое — чушь.
Не может быть 2^16 серого ни для RGB - R=G=B, ни для GrayScale - палитра всего имеет 256 вхождений
Anatoly Podgoretsky (2007-09-25 23:05:00) [30]> homm (25.09.2007 22:41:10) [10]
Еще раз GrayScale - это 8 бит с палитрой
Оттенки серого это когда R=G=B
Suchair (2007-09-25 23:04:00) [31]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 появляется ряд точек от черного до красного. а мне надобы белый
homm (2007-09-25 22:41:00) [32]> [6] Anatoly Podgoretsky © (25.09.07 22:07)
> Не возможно по определению, для RGB и для палитр.
Что не возможно? Формата такого быть не может? Или отобразить нелзя? И то и другое — чушь.
> [7] Anatoly Podgoretsky © (25.09.07 22:07)
> Ты про GrayScale или именно про оттенки?
А чем термин на английском языке отличается от термина на русском?
Pavia (2007-09-25 22:35:00) [33]для отоброжения тебе надо преобразовать в 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. Писал прямо здесь без проверки.
Suchair (2007-09-25 22:18:00) [34]я про оттенки. на один пиксель отведено 2 байта.
но проблема то не в том как кодируется изображение.
считать два байта для каждого пикселя и получить значение яркости этого пикселя не проблема. даже преобразовать значение яркости из 0..2^16 к 0..255 тоже не проблема.
не получается нарисовать пиксель.
Anatoly Podgoretsky (2007-09-25 22:07:00) [35]> homm (25.09.2007 21:47:05) [5]
Ты про GrayScale или именно про оттенки?
Anatoly Podgoretsky (2007-09-25 22:07:00) [36]> Suchair (25.09.2007 21:44:04) [4]
> 2^16 градаций серого.
Не возможно по определению, для RGB и для палитр.
homm (2007-09-25 21:47:00) [37]> [4] Suchair (25.09.07 21:44)
А ты преобразу то, что считано в 256 отенков серого на лету прямо.
Suchair (2007-09-25 21:44:00) [38]да, ошибся, изображение не монохромное. 2^16 градаций серого.
разрешение фиксированное.
считать его можно разными способами, а вот как его отобразить на форме то что считано.
TImage вроде не подходит, или у меня руки кривые....
Anatoly Podgoretsky (2007-09-25 21:37:00) [39]GrayScale это 8 бит + палитра
А 16 бит это R5G5B5 или R5G6B5 без палитры
tesseract (2007-09-25 21:30:00) [40]
> когда можно обойтись одним битом? И ещё - разрешение картинки
> как будешь определять? Или оно известно заранее?
Разрешение фиксированное, изображение не монохромное, а GrayScale. Читаеться в массив Word - он как раз два байта.