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

Вниз

Гугл хром браузер и bmp   Найти похожие ветки 

 
alexdn ©   (2013-05-27 17:21) [0]

Почему хром браузер не отображает bmp? Это что, у них политика такая? мол типа битмап это системный файл?


 
RWolf ©   (2013-05-27 17:25) [1]

у меня отображает.


 
brother ©   (2013-05-27 17:27) [2]

> типа битмап это системный файл?

сам понял, что сказал?


 
alexdn ©   (2013-05-27 17:35) [3]

а может даже по другому нужно было задать вопрос, почему гугл хром не считает битмапом файл, который делается в делфи так -
name:=SavePictureDialog1.FileName+".bmp";
Image1.Picture.Bitmap.SaveToFile(name);


 
Jeer ©   (2013-05-27 17:37) [4]

Хром предохраняет от э.. непотребства.
Угадал?


 
Дмитрий СС   (2013-05-27 17:37) [5]

И слава богу. Допотопный формат, пора ему и вымереть (на ББ как минимум).


 
брат Птибурдукова   (2013-05-27 17:40) [6]

Удалено модератором


 
RWolf ©   (2013-05-27 17:40) [7]


> [3]

Скопипастил код, запустил, открыл. УМВР.


 
alexdn ©   (2013-05-27 17:44) [8]

Удалено модератором


 
alexdn ©   (2013-05-27 17:47) [9]

Но увы, ответ я так и не услышал.


 
Игорь Шевченко ©   (2013-05-27 18:03) [10]

в [1] ответили


 
Eraser ©   (2013-05-27 18:03) [11]


> Дмитрий СС   (27.05.13 17:37) [5]

bmp вымрет последний среди всех графических форматов.


 
Дмитрий СС   (2013-05-27 19:02) [12]


> Eraser ©   (27.05.13 18:03) [11]

Крайне сомнительное утверждение.


 
Алканавт расправил плечи   (2013-05-27 19:50) [13]


> Крайне сомнительное утверждение.
Проблемка в том, что и [5], и [11] правы


 
antonn ©   (2013-05-27 20:25) [14]


> Крайне сомнительное утверждение.

никаких сомнений, особенно для тех кто с графикой работает


 
Sapersky   (2013-05-27 20:57) [15]

Формат создаваемых в Дельфи битмапов по умолчанию 32-битный, при этом функции GDI затирают 4-й байт, а Хром считает его альфа-каналом.
В общем, PixelFormat := pf24Bit должно помочь.


 
alexdn ©   (2013-05-27 21:07) [16]

> Sapersky   (27.05.13 20:57) [15]
Мерси, вот и ответ, а то я уже думал что это у меня глюки, а чего ж это Хром такой придирчивый? опера и ехплорер гораздо терпимее.. Или это уровень хром разработчиков (повышенный)?


 
alexdn ©   (2013-05-27 21:15) [17]

> Sapersky   (27.05.13 20:57) [15]
> его альфа-каналом.
Ну точно, сама картинка есть, по размеру файла, но белая.


 
alexdn ©   (2013-05-27 22:20) [18]

> Sapersky   (27.05.13 20:57) [15]
Совершенно дурной вопрос, почему функции GDI затирают 4-й байт, и почему Хром считает его альфа-каналом?


 
antonn ©   (2013-05-27 22:47) [19]

а почему бы не считать его альфаканалом, если и МС-овские функции типа updatelayeredwindow поступают так же


 
Eraser ©   (2013-05-27 23:21) [20]


> alexdn ©   (27.05.13 22:20) [18]

смотря какие функции.


 
Sapersky   (2013-05-28 01:37) [21]

Затирают альфу функции рисования вроде FillRect - видимо потому, что 4 байта проще и быстрее записать чем 3. Сейчас понятно, что лучше туда 255 писать, но во времена разработки GDI про прозрачность вообще не думали.

В современных граф. API и библиотеках 4-й байт однозначно ассоциируется с прозрачностью. С другой стороны, в стандарте bmp прозрачность не прописана (только в новых заголовках V4/V5, которые AFAIK никто не использует), 4-й байт полагается просто игнорировать. И здесь уж каждый сам решает, как делать - по стандарту или по общепринятым "понятиям".

На мой взгляд, возможность смотреть bmp с альфой полезна для графического вьюера - при условии, что её можно отключить (как в XnView, например). А браузерам лучше не выпендриваться и следовать стандарту.


 
.пас и .бмп будут жить!   (2013-05-28 02:04) [22]

>никаких сомнений, особенно для тех кто с графикой
растром или вектором ? :)
> работает


 
Дмитрий С ©   (2013-05-28 02:34) [23]


> никаких сомнений, особенно для тех кто с графикой работает

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


 
alexdn ©   (2013-05-28 07:53) [24]

> Sapersky   (28.05.13 01:37) [21]
> А браузерам лучше не выпендриваться
> и следовать стандарту.
Какому стандарту, программирования как хром, или пользовательскому стандарту, как опера и эксплорер?


 
Алканавт расправил плечи   (2013-05-28 07:58) [25]


> Ему повезло лишь потому, что его формат совпадает с форматом
> распакованной графики в памяти
"Если это везение, то спортсмену везет каждый раз, когда он попадает ракеткой по мячу. Везение всегда лишь результат тщательной подготовки" http://flibusta.net/b/136940/read


 
Dimka Maslov ©   (2013-05-28 08:21) [26]

Нормальная программа при чтении файла любого формата сначала должна прочитать заголовок, а потом делать предположение о структуре данных. При этом если заголовок не понятен - выдать предупреждение о неправильном (неподдерживаемом) формате данных. Всё таки я не думаю, что в гугле разработчики подобного уровня, чтобы этого не делать. Так что проблема, скорее всего в другом месте, а именно в самом файле.


 
alexdn ©   (2013-05-28 08:47) [27]

> Dimka Maslov ©   (28.05.13 08:21) [26]
А чего не поддерживаемый формат то? всё правильно, а то что альфа канал затёрт это не гугла проблема.


 
alexdn ©   (2013-05-28 09:06) [28]

> Sapersky   (27.05.13 20:57) [15]
> В общем, PixelFormat := pf24Bit должно помочь.
Form4.Image1.Picture.Bitmap.PixelFormat:=jf24Bit;
[DCC Error] Unit4.pas(1065): E2010 Incompatible types: "TBitmap" and "TJPEGPixelFormat"


 
Алканавт расправил плечи   (2013-05-28 09:24) [29]

Всемилостивый будда Гаутама… Ты разницу между pf и jf видишь?..


 
alexdn ©   (2013-05-28 09:34) [30]

> Алканавт расправил плечи   (28.05.13 09:24) [29]
Да, долго ржал, поставил -
Form4.Image1.Picture.Bitmap.PixelFormat:=pf24Bit; - в хроме видно;
Form4.Image1.Picture.Bitmap.PixelFormat:=pf32Bit; - в хроме исчезает;
как жить?)


 
alexdn ©   (2013-05-28 09:45) [31]

Это что ж, хром получается Эмбаркадеро большой привет передал?:)


 
alexdn ©   (2013-05-28 10:06) [32]

В свете вышеизложенного так и хочется спросить а что там у microsoft с сохранением bmp? в с и с#?


 
Дмитрий С ©   (2013-05-28 10:08) [33]


> Это что ж, хром получается Эмбаркадеро большой привет передал?
> :)

при pf32Bit ты можешь сам задать значения этого альфаканала, причем тут эмбаркадеро


 
antonn ©   (2013-05-28 10:11) [34]


> Dimka Maslov ©   (28.05.13 08:21) [26]
>
> Нормальная программа при чтении файла любого формата сначала
> должна прочитать заголовок, а потом делать предположение
> о структуре данных. При этом если заголовок не понятен -
>  выдать предупреждение о неправильном (неподдерживаемом)
> формате данных. Всё таки я не думаю, что в гугле разработчики
> подобного уровня, чтобы этого не делать. Так что проблема,
>  скорее всего в другом месте, а именно в самом файле.

если ты в дельфи просто сменишь pf24bit на pf32bit, то получится битмап с зануленной альфой (4-й байт) который браузер и старается отобразить согласно заголовку. поэтому прежде чем указывать формат в 4 байта битмапу следует понимать что случится и зачем оно надо


 
alexdn ©   (2013-05-28 10:17) [35]

> antonn ©   (28.05.13 10:11) [34]
вообще эмбаркадеро лихо поступили, давайте мол обнулим, это они наверное первого апреля решили)..


 
robt5   (2013-05-28 10:26) [36]

проблема в том что "Гугл овцы" зазвездились малясь, недавно только была тема что он jpeg в CMYK некоректно отображает, я уж молчу про "безопасность"


 
robt5   (2013-05-28 10:29) [37]


> alexdn ©   (28.05.13 10:17) [35]

ну что ты бредишь то ?
они должны были цифровой шум туда набить?
альфаканал заполняется програмистом


 
alexdn ©   (2013-05-28 10:37) [38]

> robt5   (28.05.13 10:29) [37]
Да нет, я скорее к тому, что стандартная конструкция должна идти в виде -
name:=SavePictureDialog1.FileName+".bmp";
Image1.Picture.Bitmap.PixelFormat:=pf24Bit;
Image1.Picture.Bitmap.SaveToFile(name);
чтобы проблем не было.. или действительно pf32Bit, но тогда и альфа канал на 255 прописывать. Но кстати кроме хрома нигде таких проблем больше не всплывало.


 
antonn ©   (2013-05-28 12:09) [39]


> Да нет, я скорее к тому, что стандартная конструкция должна
> идти в виде -

хм, а теперь tbitmap дефолтно в формате 32-х бит создается в новых студиях?


 
alexdn ©   (2013-05-28 12:21) [40]

> antonn ©   (28.05.13 12:09) [39]
в 2010 выходит что так. Кстати, как оговорить альфа канал для bmp? что то нигде не могу найти..


 
Дмитрий СС   (2013-05-28 13:39) [41]

С помощью ScanLine


 
Дмитрий СС   (2013-05-29 14:07) [42]

Вот пример:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Math;

type
 TForm1 = class(TForm)
   procedure FormShow(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   procedure HitTest(var M: TWMNCHitTest); message WM_NCHITTEST;
 protected
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.HitTest(var M: TWMNCHitTest);
begin
 M.Result := HTCAPTION;
end;

procedure AlphaPremultiBmp(Bmp: HBITMAP);
var
 BmpInfo:Windows.TBitmap;
 Point: PRGBQuad;
 I:Integer;
begin
 GetObject(Bmp, SizeOf(BmpInfo), @BmpInfo);
 Point := BmpInfo.bmBits;
 for i:=0 to pred(BmpInfo.bmWidth * BmpInfo.bmHeight) do
 begin
   Point^.rgbBlue := MulDiv(Point^.rgbBlue, Point^.rgbReserved, 255);
   Point^.rgbGreen := MulDiv(Point^.rgbGreen, Point^.rgbReserved, 255);
   Point^.rgbRed := MulDiv(Point^.rgbRed, Point^.rgbReserved, 255);
   inc(Point);
 end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
 Bmp: TBitmap;
 SignBmp: TBitmap;
 BmpC, SignC: PRGBQuad;
 X, Y: Integer;
 Pt: TPoint;
 Sz: TSize;
 F: TBlendFunction;
 ScreenDC, BmpDC, SavedDC: HDC;
begin
 SetWindowLong(Handle,
   GWL_EXSTYLE,
   GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);

 Bmp := TBitmap.Create;
 try
   Bmp.PixelFormat := pf32bit;
   Bmp.Width := ClientWidth;
   Bmp.Height := ClientHeight;

   SignBmp := TBitmap.Create;
   try
     SignBmp.PixelFormat := pf32bit;
     SignBmp.Width := ClientWidth;
     SignBmp.Height := ClientHeight;

     SignBmp.Canvas.Brush.Color := clBlack;
     SignBmp.Canvas.Brush.Style := bsSolid;
     SignBmp.Canvas.FillRect(Rect(0,0, SignBmp.Width, SignBmp.Height));
     SignBmp.Canvas.Font.Name := "Times";
     SignBmp.Canvas.Font.Size := 72;
     SignBmp.Canvas.Font.Color := clWhite;
     SignBmp.Canvas.TextOut(10, 10, "Hello, Kitty!");

     for Y := 0 to Pred(Bmp.Height) do
     begin
       BmpC := Bmp.ScanLine[Y];
       SignC := SignBmp.ScanLine[Y];
       for X := 0 to Pred(Bmp.Width) do
       begin
         ZeroMemory(BmpC, SizeOf(BmpC^));
         BmpC^.rgbRed := Y * 255 div Bmp.Height;
         BmpC^.rgbBlue := (255 - Y * 255 div Bmp.Height) div 4;
         BmpC^.rgbGreen := SignC^.rgbGreen;
         BmpC^.rgbReserved := 255 - X * 255 div Bmp.Width; // random alpha
         Inc(BmpC);
         Inc(SignC);
       end;
     end;
   finally
     SignBmp.Free;
   end;

   ZeroMemory(@Pt, SizeOf(Pt));

   Sz.cx := ClientWidth;
   Sz.cy := ClientHeight;

   ZeroMemory(@F, SizeOf(F));
   F.BlendOp := AC_SRC_OVER;
   F.AlphaFormat := AC_SRC_ALPHA;
   F.SourceConstantAlpha := 255;

   AlphaPremultiBmp(Bmp.Handle);

   ScreenDC := GetDC(0);
   try
     BmpDC := CreateCompatibleDC(ScreenDC);
     try
       SavedDC := SelectObject(BmpDC, Bmp.Handle);
       try
         UpdateLayeredWindow(Handle, ScreenDC, nil, @Sz, BmpDC, @Pt, 0, @F, ULW_ALPHA);
       finally
         SelectObject(SavedDC, Bmp.Handle);
       end;
     finally
       DeleteDC(BmpDC);
     end;
   finally
     ReleaseDC(0, ScreenDC);
   end;
 finally
   Bmp.Free;
 end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 BorderStyle := bsNone;
 FormStyle := fsStayOnTop;
end;

end.



 
Rouse_ ©   (2013-05-29 22:21) [43]


> Дмитрий СС   (29.05.13 14:07) [42]

ScreenDC и BmpDC := CreateCompatibleDC(ScreenDC); лишние, а так-же SelectObject лишнее.
Вместо первого достаточно нуля, вместо второго хэндла канваса битмапа с альфаканалом.


 
Rouse_ ©   (2013-05-29 22:30) [44]

Удалено модератором
Примечание: промахнулся...


 
Rouse_ ©   (2013-05-29 22:30) [45]

Блин... вот так:

  UpdateLayeredWindow(Handle, 0, nil, @Sz, Bmp.Canvas.Handle, @Pt, 0, @F, ULW_ALPHA);

  {ScreenDC := GetDC(0);
  try
    BmpDC := CreateCompatibleDC(ScreenDC);
    try
      SavedDC := SelectObject(BmpDC, Bmp.Handle);
      try
        UpdateLayeredWindow(Handle, ScreenDC, nil, @Sz, BmpDC, @Pt, 0, @F, ULW_ALPHA);
      finally
        SelectObject(SavedDC, Bmp.Handle);
      end;
    finally
      DeleteDC(BmpDC);
    end;
  finally
    ReleaseDC(0, ScreenDC);
  end;  }


 
Rouse_ ©   (2013-05-29 22:31) [46]

зы и AlphaPremultiBmp тоже избыточен.


 
Дмитрий С ©   (2013-05-29 23:40) [47]


> зы и AlphaPremultiBmp тоже избыточен.

Вот тут пишут что нужен для BLENDFUNCTION:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd183393(v=vs.85).aspx

Да и разница есть:
http://yadi.sk/d/vEv7wVJO5JDdm
Слева без AlphaPremultiBmp, справа с ним.


> Rouse_ ©   (29.05.13 22:30) [45]

Действительно работает. Тем более в моем примере, который я еще в 2008 году написал, примерно так и написано. А в этом примере, пока я его писал, почему-то не работало, поэтому я сделал так. Видимо пока делал, исправил что-то.



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

Текущий архив: 2013.11.17;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.009 c
15-1369945803
Юрий
2013-05-31 00:30
2013.11.17
С днем рождения ! 31 мая 2013 пятница


1-1317284571
Alex_C
2011-09-29 12:22
2013.11.17
Сохранение файла в Thread?


15-1370032202
Юрий
2013-06-01 00:30
2013.11.17
С днем рождения ! 1 июня 2013 суббота


15-1370184813
Eraser
2013-06-02 18:53
2013.11.17
Panel и fade эффект


2-1360495510
Максим
2013-02-10 15:25
2013.11.17
Базы данных