Форум: "Основная";
Текущий архив: 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