Мешайте Activerecord загрузить столбец Blob

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

Я знаю, что эта ветка немного устарела, но ее один из лучших результатов для запросов в Google для как круглые углы ImageViews на Android.

/**
 * Use this method to scale a bitmap and give it specific rounded corners.
 * @param context Context object used to ascertain display density.
 * @param bitmap The original bitmap that will be scaled and have rounded corners applied to it.
 * @param upperLeft Corner radius for upper left.
 * @param upperRight Corner radius for upper right.
 * @param lowerRight Corner radius for lower right.
 * @param lowerLeft Corner radius for lower left.
 * @param endWidth Width to which to scale original bitmap.
 * @param endHeight Height to which to scale original bitmap.
 * @return Scaled bitmap with rounded corners.
 */
public static Bitmap getRoundedCornerBitmap(Context context, Bitmap bitmap, float upperLeft,
        float upperRight, float lowerRight, float lowerLeft, int endWidth,
        int endHeight) {
    float densityMultiplier = context.getResources().getDisplayMetrics().density;

    // scale incoming bitmap to appropriate px size given arguments and display dpi
    bitmap = Bitmap.createScaledBitmap(bitmap, 
            Math.round(endWidth * densityMultiplier),
            Math.round(endHeight * densityMultiplier), true);

    // create empty bitmap for drawing
    Bitmap output = Bitmap.createBitmap(
            Math.round(endWidth * densityMultiplier),
            Math.round(endHeight * densityMultiplier), Config.ARGB_8888);

    // get canvas for empty bitmap
    Canvas canvas = new Canvas(output);
    int width = canvas.getWidth();
    int height = canvas.getHeight();

    // scale the rounded corners appropriately given dpi
    upperLeft *= densityMultiplier;
    upperRight *= densityMultiplier;
    lowerRight *= densityMultiplier;
    lowerLeft *= densityMultiplier;

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);

    // fill the canvas with transparency
    canvas.drawARGB(0, 0, 0, 0);

    // draw the rounded corners around the image rect. clockwise, starting in upper left.
    canvas.drawCircle(upperLeft, upperLeft, upperLeft, paint);
    canvas.drawCircle(width - upperRight, upperRight, upperRight, paint);
    canvas.drawCircle(width - lowerRight, height - lowerRight, lowerRight, paint);
    canvas.drawCircle(lowerLeft, height - lowerLeft, lowerLeft, paint);

    // fill in all the gaps between circles. clockwise, starting at top.
    RectF rectT = new RectF(upperLeft, 0, width - upperRight, height / 2);
    RectF rectR = new RectF(width / 2, upperRight, width, height - lowerRight);
    RectF rectB = new RectF(lowerLeft, height / 2, width - lowerRight, height);
    RectF rectL = new RectF(0, upperLeft, width / 2, height - lowerLeft);

    canvas.drawRect(rectT, paint);
    canvas.drawRect(rectR, paint);
    canvas.drawRect(rectB, paint);
    canvas.drawRect(rectL, paint);

    // set up the rect for the image
    Rect imageRect = new Rect(0, 0, width, height);

    // set up paint object such that it only paints on Color.WHITE
    paint.setXfermode(new AvoidXfermode(Color.WHITE, 255, AvoidXfermode.Mode.TARGET));

    // draw resized bitmap onto imageRect in canvas, using paint as configured above
    canvas.drawBitmap(bitmap, imageRect, imageRect, paint);

    return output;
}
10
задан Serhat Ozgel 23 September 2008 в 10:41
поделиться

4 ответа

Я полагаю, что можно попросить, чтобы AR загрузил определенные столбцы в вызове для нахождения:

MyModel.find(id, :select => 'every, attribute, except, the, blobs')

Однако это должно было бы быть обновлено, поскольку Вы добавляете столбцы, таким образом, это не идеально. Я не думаю, что существует любой способ конкретно исключить один столбец в направляющих (ни в единственном выборе SQL).

Я предполагаю, что Вы могли записать это как это:

MyModel.find(id, :select => (MyModel.column_names - ['column_to_exclude']).join(', '))

Проверьте их перед Вами честное слово все же.:)

4
ответ дан 3 December 2019 в 18:37
поделиться

Ответ fd в основном правильный, но ActiveRecord в настоящее время не принимает массив в качестве аргумента: select, поэтому вам нужно объединить нужные столбцы в запятую. -delimited строка, например:

desired_columns = (MyModel.column_names - ['column_to_exclude']).join(', ')
MyModel.find(id, :select => desired_columns)
4
ответ дан 3 December 2019 в 18:37
поделиться

Чистый подход, НЕ ТРЕБУЮЩИЙ ИЗМЕНЕНИЙ в способе кодирования в другом месте приложения, т. Е. Без возни с : выберите параметры

По любой причине, которая вам нужна для хранения больших двоичных объектов в базах данных. Тем не менее, вы не хотите смешивать столбцы BLOB-объектов в той же таблице, что и ваша обычные атрибуты. BinaryColumnTable помогает хранить ВСЕ капли в отдельная таблица, прозрачно управляемая моделью ActiveRecord. При желании он помогает записывать тип содержимого большого двоичного объекта.

http://github.com/choonkeat/binary_column_table

Простое использование

Member.create(:name => "Michael", :photo => IO.read("avatar.png"))
#=> creates a record in "members" table, saving "Michael" into the "name" column
#=> creates a record in "binary_columns" table, saving "avatar.png" binary into "content" column

m = Member.last #=> only columns in "members" table is fetched (no blobs)
m.name          #=> "Michael"
m.photo         #=> binary content of the "avatar.png" file
1
ответ дан 3 December 2019 в 18:37
поделиться

Я только что столкнулся с этим, используя направляющую 3.

К счастью, это было не так сложно решить. Я установил default_scope , который удалял те столбцы, которые мне не нужны, из результата. Например, в моей модели было текстовое поле xml, которое могло быть довольно длинным и не использовалось в большинстве представлений.

default_scope select((column_names - ['data']).map { |column_name| "`#{table_name}`.`#{column_name}`"})

Из решения вы увидите, что мне пришлось сопоставить столбцы с полностью квалифицированными версиями, чтобы я мог продолжать использовать модель через отношения без двусмысленности в атрибутах. Позже, когда вы захотите, чтобы поле было просто прикреплено к другому .select (: data) , чтобы оно было включено.

12
ответ дан 3 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: